1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
use objc2::msg_send;
use objc2::rc::{DefaultId, Id, Owned, Shared};
use crate::{NSAttributedString, NSCopying, NSMutableCopying, NSObject, NSString};
object! {
unsafe pub struct NSMutableAttributedString: NSAttributedString, NSObject;
}
unsafe impl Sync for NSMutableAttributedString {}
unsafe impl Send for NSMutableAttributedString {}
impl NSMutableAttributedString {
unsafe_def_fn! {
pub fn new -> Owned;
}
#[doc(alias = "initWithString:")]
pub fn from_nsstring(string: &NSString) -> Id<Self, Owned> {
unsafe {
let obj: *mut Self = msg_send![Self::class(), alloc];
let obj: *mut Self = msg_send![obj, initWithString: string];
Id::new(obj).unwrap()
}
}
#[doc(alias = "initWithAttributedString:")]
pub fn from_attributed_nsstring(attributed_string: &NSAttributedString) -> Id<Self, Owned> {
unsafe {
let obj: *mut Self = msg_send![Self::class(), alloc];
let obj: *mut Self = msg_send![obj, initWithAttributedString: attributed_string];
Id::new(obj).unwrap()
}
}
}
impl NSMutableAttributedString {
#[doc(alias = "setAttributedString:")]
pub fn replace(&mut self, attributed_string: &NSAttributedString) {
unsafe { msg_send![self, setAttributedString: attributed_string] }
}
}
impl DefaultId for NSMutableAttributedString {
type Ownership = Owned;
#[inline]
fn default_id() -> Id<Self, Self::Ownership> {
Self::new()
}
}
unsafe impl NSCopying for NSMutableAttributedString {
type Ownership = Shared;
type Output = NSAttributedString;
}
unsafe impl NSMutableCopying for NSMutableAttributedString {
type Output = NSMutableAttributedString;
}
impl alloc::borrow::ToOwned for NSMutableAttributedString {
type Owned = Id<NSMutableAttributedString, Owned>;
fn to_owned(&self) -> Self::Owned {
self.mutable_copy()
}
}
#[cfg(test)]
mod tests {
use alloc::string::ToString;
use super::*;
#[test]
fn test_new() {
let s = NSAttributedString::new();
assert_eq!(&s.string().to_string(), "");
}
#[test]
fn test_copy() {
let s1 = NSMutableAttributedString::from_nsstring(&NSString::from_str("abc"));
let s2 = s1.copy();
assert_ne!(
Id::as_ptr(&s1) as *const NSAttributedString,
Id::as_ptr(&s2)
);
assert!(s2.is_kind_of(NSAttributedString::class()));
let s3 = s1.mutable_copy();
assert_ne!(Id::as_ptr(&s1), Id::as_ptr(&s3));
assert!(s3.is_kind_of(NSMutableAttributedString::class()));
}
}