y-rb 0.1.3 → 0.1.4.alpha.1

Sign up to get free protection for your applications and to get access to all the features.
data/src/util.rs DELETED
@@ -1,146 +0,0 @@
1
- use crate::ymap::MAP_WRAPPER;
2
- use crate::ytext::TEXT_WRAPPER;
3
- use crate::yxml::{XML_ELEMENT_WRAPPER, XML_TEXT_WRAPPER};
4
- use lib0::any::Any;
5
- use rutie::{
6
- AnyException, AnyObject, Array, Boolean, Exception, Fixnum, Float, Hash,
7
- Integer, Module, NilClass, Object, RString, Symbol
8
- };
9
- use std::borrow::Borrow;
10
- use std::collections::HashMap;
11
- use std::convert::TryFrom;
12
- use std::rc::Rc;
13
- use yrs::types::{Attrs, Value};
14
-
15
- pub(crate) fn convert_vecu8_to_array(vec: Vec<u8>) -> Array {
16
- let mut array = Array::new();
17
-
18
- for i in vec {
19
- array.push(Fixnum::new(i64::from(i)));
20
- }
21
-
22
- array
23
- }
24
-
25
- pub(crate) fn convert_array_to_vecu8(arr: Array) -> Vec<u8> {
26
- arr.into_iter()
27
- .map(|val| val.try_convert_to::<Fixnum>().unwrap().to_u32())
28
- .map(|val| u8::try_from(val).unwrap())
29
- .collect()
30
- }
31
-
32
- pub(crate) fn map_any_type_to_ruby(input: &Any) -> AnyObject {
33
- match input {
34
- Any::Null => NilClass::new().to_any_object(),
35
- Any::Undefined => NilClass::new().to_any_object(),
36
- Any::Bool(b) => Boolean::new(*b).to_any_object(),
37
- Any::Number(f) => Float::new(*f).to_any_object(),
38
- Any::BigInt(i) => Integer::new(*i).to_any_object(),
39
- Any::String(s) => RString::new_utf8(s.as_ref()).to_any_object(),
40
- // TODO convert buffer into an array of Fixnum
41
- Any::Buffer(_b) => Array::new().to_any_object(),
42
- Any::Array(a) => {
43
- let values = a.iter().map(|n| map_any_type_to_ruby(n));
44
- Array::from_iter(values).to_any_object()
45
- }
46
- Any::Map(m) => {
47
- let mut h = Hash::new();
48
- m.iter().for_each(|(k, v)| {
49
- let key = Symbol::new(k.as_ref());
50
- let val = map_any_type_to_ruby(v);
51
- h.store(key, val);
52
- });
53
- h.to_any_object()
54
- }
55
- }
56
- }
57
-
58
- pub(crate) fn map_yrs_value_to_ruby(value: Value) -> AnyObject {
59
- match value {
60
- Value::Any(v) => map_any_type_to_ruby(v.borrow()),
61
- Value::YArray(a) => {
62
- let values = a.iter().map(|n| map_yrs_value_to_ruby(n));
63
- Array::from_iter(values).to_any_object()
64
- }
65
- Value::YMap(m) => Module::from_existing("Y")
66
- .get_nested_class("Text")
67
- .wrap_data(m, &*MAP_WRAPPER),
68
- Value::YText(t) => Module::from_existing("Y")
69
- .get_nested_class("Text")
70
- .wrap_data(t, &*TEXT_WRAPPER),
71
- Value::YXmlElement(x) => Module::from_existing("Y")
72
- .get_nested_class("XMLElement")
73
- .wrap_data(x, &*XML_ELEMENT_WRAPPER),
74
- Value::YXmlText(x) => Module::from_existing("Y")
75
- .get_nested_class("XMLText")
76
- .wrap_data(x, &*XML_TEXT_WRAPPER)
77
- }
78
- }
79
-
80
- pub(crate) fn map_ruby_type_to_rust(
81
- input: AnyObject
82
- ) -> Result<Any, AnyException> {
83
- if let Ok(_v) = input.try_convert_to::<NilClass>() {
84
- return Ok(Any::Null);
85
- } else if let Ok(v) = input.try_convert_to::<Boolean>() {
86
- return Ok(Any::Bool(v.to_bool()));
87
- } else if let Ok(v) = input.try_convert_to::<Float>() {
88
- return Ok(Any::Number(v.to_f64()));
89
- } else if let Ok(v) = input.try_convert_to::<Fixnum>() {
90
- return Ok(Any::BigInt(v.to_i64()));
91
- } else if let Ok(v) = input.try_convert_to::<Integer>() {
92
- return Ok(Any::BigInt(v.to_i64()));
93
- } else if let Ok(v) = input.try_convert_to::<RString>() {
94
- return Ok(Any::String(Box::from(v.to_str())));
95
- } else if let Ok(v) = input.try_convert_to::<Array>() {
96
- let arr: Vec<Any> = v
97
- .into_iter()
98
- .map(|value| map_ruby_type_to_rust(value).unwrap())
99
- .collect();
100
- return Ok(Any::Array(arr.into_boxed_slice()));
101
- } else if let Ok(v) = input.try_convert_to::<Hash>() {
102
- let m = map_hash_to_rust(v);
103
- return Ok(Any::Map(Box::from(m)));
104
- }
105
-
106
- Err(AnyException::new(
107
- "TypeError",
108
- Some("cannot map input type")
109
- ))
110
- }
111
-
112
- // This function gets reported as unused.
113
- pub(crate) fn map_hash_to_rust(input: Hash) -> HashMap<String, Any> {
114
- let mut m = HashMap::with_capacity(input.length());
115
- input.each(|key, value| {
116
- if let Ok(v) = map_ruby_type_to_rust(value) {
117
- if let Ok(k) = key.try_convert_to::<RString>() {
118
- m.insert(k.to_string(), v);
119
- } else if let Ok(k) = key.try_convert_to::<Symbol>() {
120
- m.insert(k.to_string(), v);
121
- }
122
- }
123
- });
124
- m
125
- }
126
-
127
- pub(crate) fn map_hash_to_attrs(input: Hash) -> Attrs {
128
- let attributes = map_hash_to_rust(input);
129
- let mut attrs = Attrs::with_capacity(attributes.len());
130
- for (k, v) in attributes {
131
- attrs.insert(Rc::from(k), v);
132
- }
133
- attrs
134
- }
135
-
136
- pub(crate) fn map_attrs_to_hash(attrs: Attrs) -> Hash {
137
- let mut h = Hash::new();
138
-
139
- for (key, val) in attrs {
140
- let key = Symbol::new(key.as_ref());
141
- let value = map_any_type_to_ruby(val.borrow());
142
- h.store(key, value);
143
- }
144
-
145
- h
146
- }
data/src/yarray.rs DELETED
@@ -1,184 +0,0 @@
1
- use crate::util::{map_ruby_type_to_rust, map_yrs_value_to_ruby};
2
- use crate::ytransaction::{YTransaction, TRANSACTION_WRAPPER};
3
- use rutie::{
4
- AnyObject, Array as RArray, Fixnum, Hash, Integer, NilClass, Object, Proc,
5
- Symbol, VM
6
- };
7
- use yrs::types::{Change, Value};
8
- use yrs::{Array, SubscriptionId};
9
-
10
- wrappable_struct!(Array, ArrayWrapper, ARRAY_WRAPPER);
11
- class!(YArray);
12
-
13
- #[rustfmt::skip]
14
- methods!(
15
- YArray,
16
- rtself,
17
- fn yarray_each(block: Proc) -> NilClass {
18
- let b = block.map_err(|e| VM::raise_ex(e)).unwrap();
19
-
20
- let a: &Array = rtself.get_data(&*ARRAY_WRAPPER);
21
-
22
- a
23
- .iter()
24
- .for_each(|val| {
25
- let args = [map_yrs_value_to_ruby(val)];
26
- b.call(&args);
27
- });
28
-
29
- NilClass::new()
30
- },
31
- fn yarray_get(index: Fixnum) -> AnyObject {
32
- let i = index.map_err(|e| VM::raise_ex(e)).unwrap();
33
-
34
- let arr: &Array = rtself.get_data(&*ARRAY_WRAPPER);
35
- let val = arr.get(i.to_u32());
36
-
37
- map_yrs_value_to_ruby(val.unwrap())
38
- },
39
- fn yarray_insert(
40
- transaction: YTransaction,
41
- index: Fixnum,
42
- value: AnyObject) -> NilClass {
43
- let mut txn = transaction.map_err(|e| VM::raise_ex(e)).unwrap();
44
- let tx = txn.get_data_mut(&*TRANSACTION_WRAPPER);
45
-
46
- let i = index.map_err(|e| VM::raise_ex(e)).unwrap();
47
-
48
- let val = value.map_err(|e| VM::raise_ex(e)).unwrap();
49
- let v = map_ruby_type_to_rust(val).unwrap();
50
-
51
- let arr: &Array = rtself.get_data(&*ARRAY_WRAPPER);
52
- arr.insert(tx, i.to_u32(), v);
53
-
54
- NilClass::new()
55
- },
56
- fn yarray_insert_range(
57
- transaction: YTransaction,
58
- index: Fixnum,
59
- values: RArray) -> NilClass {
60
- let mut txn = transaction.map_err(|e| VM::raise_ex(e)).unwrap();
61
- let tx = txn.get_data_mut(&*TRANSACTION_WRAPPER);
62
-
63
- let i = index.map_err(|e| VM::raise_ex(e)).unwrap();
64
-
65
- let values = values.map_err(|e| VM::raise_ex(e)).unwrap();
66
- let mapped_values = values
67
- .into_iter()
68
- .map(|value| map_ruby_type_to_rust(value).unwrap() )
69
- .collect::<Vec<_>>();
70
-
71
- let arr: &Array = rtself.get_data(&*ARRAY_WRAPPER);
72
- arr.insert_range(tx, i.to_u32(), mapped_values);
73
-
74
- NilClass::new()
75
- },
76
- fn yarray_length() -> Fixnum {
77
- let arr: &Array = rtself.get_data(&*ARRAY_WRAPPER);
78
- Fixnum::new(i64::from(arr.len()))
79
- },
80
- fn yarray_observe(callback: Proc) -> Integer {
81
- let c = callback.map_err(|e| VM::raise_ex(e)).unwrap();
82
-
83
- let arr: &mut Array = rtself.get_data_mut(&*ARRAY_WRAPPER);
84
- let subscription_id: SubscriptionId = arr
85
- .observe(move |transaction, array_event| {
86
- let delta = array_event.delta(transaction);
87
- let mut changes: Vec<AnyObject> = Vec::new();
88
-
89
- for change in delta {
90
- match change {
91
- Change::Added(v) => {
92
- let mut payload = Hash::new();
93
- let values = v.iter().map(|v| map_yrs_value_to_ruby(v.clone()) ).collect::<Vec<_>>();
94
- payload.store(Symbol::new("added"), RArray::from_iter(values));
95
-
96
- changes.push(payload.to_any_object());
97
- },
98
- Change::Retain(position) => {
99
- let mut payload = Hash::new();
100
- payload.store(Symbol::new("retain"), Integer::from(*position));
101
-
102
- changes.push(payload.to_any_object());
103
- },
104
- Change::Removed(position) => {
105
- let mut payload = Hash::new();
106
- payload.store(Symbol::new("removed"), Integer::from(*position));
107
-
108
- changes.push(payload.to_any_object());
109
- }
110
- }
111
- }
112
-
113
- let args = &[RArray::from_iter(changes).to_any_object()];
114
- c.call(args);
115
- })
116
- .into();
117
-
118
- Integer::from(subscription_id)
119
- },
120
- fn yarray_push_back(transaction: YTransaction, value: AnyObject) -> NilClass {
121
- let mut txn = transaction.map_err(|e| VM::raise_ex(e)).unwrap();
122
- let tx = txn.get_data_mut(&*TRANSACTION_WRAPPER);
123
-
124
- let val = value.map_err(|e| VM::raise_ex(e)).unwrap();
125
- let v = map_ruby_type_to_rust(val).unwrap();
126
-
127
- let arr: &Array = rtself.get_data(&*ARRAY_WRAPPER);
128
- arr.push_back(tx, v);
129
-
130
- NilClass::new()
131
- },
132
- fn yarray_push_front(transaction: YTransaction, value: AnyObject) -> NilClass {
133
- let mut txn = transaction.map_err(|e| VM::raise_ex(e)).unwrap();
134
- let tx = txn.get_data_mut(&*TRANSACTION_WRAPPER);
135
-
136
- let val = value.map_err(|e| VM::raise_ex(e)).unwrap();
137
- let v = map_ruby_type_to_rust(val).unwrap();
138
-
139
- let arr: &Array = rtself.get_data(&*ARRAY_WRAPPER);
140
- arr.push_front(tx, v);
141
-
142
- NilClass::new()
143
- },
144
- fn yarray_remove(transaction: YTransaction, index: Fixnum) -> NilClass {
145
- let mut txn = transaction.map_err(|e| VM::raise_ex(e)).unwrap();
146
- let tx = txn.get_data_mut(&*TRANSACTION_WRAPPER);
147
-
148
- let i = index.map_err(|e| VM::raise_ex(e)).unwrap();
149
-
150
- let arr: &Array = rtself.get_data(&*ARRAY_WRAPPER);
151
- arr.remove(tx, i.to_u32());
152
-
153
- NilClass::new()
154
- },
155
- fn yarray_remove_range(
156
- transaction: YTransaction,
157
- index: Fixnum,
158
- length: Fixnum) -> NilClass {
159
- let mut txn = transaction.map_err(|e| VM::raise_ex(e)).unwrap();
160
- let tx = txn.get_data_mut(&*TRANSACTION_WRAPPER);
161
-
162
- let i = index.map_err(|e| VM::raise_ex(e)).unwrap();
163
- let l = length.map_err(|e| VM::raise_ex(e)).unwrap();
164
-
165
- let arr: &Array = rtself.get_data(&*ARRAY_WRAPPER);
166
- arr.remove_range(tx, i.to_u32(), l.to_u32());
167
-
168
- NilClass::new()
169
- },
170
- fn yarray_to_a() -> RArray {
171
- let v: &Array = rtself.get_data(&*ARRAY_WRAPPER);
172
- map_yrs_value_to_ruby(Value::YArray(v.clone()))
173
- .try_convert_to::<RArray>()
174
- .unwrap()
175
- }
176
- fn yarray_unobserve(subscription_id: Integer) -> NilClass {
177
- let s = subscription_id.map_err(|e| VM::raise_ex(e)).unwrap();
178
-
179
- let arr: &mut Array = rtself.get_data_mut(&*ARRAY_WRAPPER);
180
- arr.unobserve(s.into());
181
-
182
- NilClass::new()
183
- }
184
- );
data/src/ydoc.rs DELETED
@@ -1,71 +0,0 @@
1
- use crate::util::{convert_array_to_vecu8, convert_vecu8_to_array};
2
- use crate::ytransaction::TRANSACTION_WRAPPER;
3
- use rutie::rubysys::class;
4
- use rutie::types::{Argc, Value};
5
- use rutie::util::str_to_cstring;
6
- use rutie::{AnyObject, Array, Integer, Module, Object};
7
- use std::mem;
8
- use yrs::updates::decoder::Decode;
9
- use yrs::{Doc, OffsetKind, Options, StateVector};
10
-
11
- wrappable_struct!(Doc, DocWrapper, DOC_WRAPPER);
12
- class!(YDoc);
13
-
14
- methods!(
15
- YDoc,
16
- rtself,
17
- fn ydoc_transact() -> AnyObject {
18
- let doc = rtself.get_data(&*DOC_WRAPPER);
19
- let transaction = doc.transact();
20
-
21
- Module::from_existing("Y")
22
- .get_nested_class("Transaction")
23
- .wrap_data(transaction, &*TRANSACTION_WRAPPER)
24
- },
25
- fn ydoc_encode_diff_v1(state_vector: Array) -> Array {
26
- let mut doc: &Doc = rtself.get_data_mut(&*DOC_WRAPPER);
27
- let state_vector_encoded: Vec<u8> =
28
- convert_array_to_vecu8(state_vector.unwrap());
29
-
30
- let result = &StateVector::decode_v1(state_vector_encoded.as_slice());
31
- let sv = match result {
32
- Ok(sv) => sv,
33
- Err(error) => {
34
- panic!("decoding the state vector failed: {:?}", error)
35
- }
36
- };
37
-
38
- let update = doc.encode_state_as_update_v1(sv);
39
- convert_vecu8_to_array(update)
40
- }
41
- );
42
-
43
- pub extern "C" fn ydoc_new(
44
- argc: Argc,
45
- argv: *const AnyObject,
46
- _rtself: AnyObject,
47
- ) -> AnyObject {
48
- let args = Value::from(0);
49
-
50
- unsafe {
51
- let p_argv: *const Value = mem::transmute(argv);
52
-
53
- class::rb_scan_args(argc, p_argv, str_to_cstring("*").as_ptr(), &args)
54
- };
55
-
56
- let arguments = Array::from(args);
57
- let client_id = arguments.at(0).try_convert_to::<Integer>();
58
-
59
- let mut options = Options::default();
60
- if let Ok(c_id) = client_id {
61
- options.client_id = c_id.into();
62
- };
63
- // make sure we treat offsets for codepoints not bytes
64
- options.offset_kind = OffsetKind::Utf32;
65
-
66
- let doc = Doc::with_options(options);
67
-
68
- Module::from_existing("Y")
69
- .get_nested_class("Doc")
70
- .wrap_data(doc, &*DOC_WRAPPER)
71
- }
data/src/ymap.rs DELETED
@@ -1,199 +0,0 @@
1
- use crate::util::{map_ruby_type_to_rust, map_yrs_value_to_ruby};
2
- use crate::ytransaction::{YTransaction, TRANSACTION_WRAPPER};
3
- use lib0::any::Any;
4
- use rutie::{
5
- AnyObject, Array, Boolean, Class, Fixnum, Hash, Integer, NilClass, Object,
6
- Proc, RString, Symbol, VM
7
- };
8
- use std::rc::Rc;
9
- use yrs::types::EntryChange;
10
- use yrs::{Map, SubscriptionId};
11
-
12
- wrappable_struct!(Map, MapWrapper, MAP_WRAPPER);
13
- class!(YMap);
14
-
15
- #[rustfmt::skip]
16
- methods!(
17
- YMap,
18
- rtself,
19
- fn ymap_clear(transaction: YTransaction) -> NilClass {
20
- let mut tx = transaction.map_err(|e| VM::raise_ex(e)).unwrap();
21
- let txn = tx.get_data_mut(&*TRANSACTION_WRAPPER);
22
-
23
- let m: &Map = rtself.get_data(&*MAP_WRAPPER);
24
- m.clear(txn);
25
-
26
- NilClass::new()
27
- },
28
- fn ymap_contains(key: AnyObject) -> Boolean {
29
- let k = key.map_err(|e| VM::raise_ex(e)).unwrap();
30
-
31
- let k2 = if let Ok(t) = k.try_convert_to::<Symbol>() {
32
- t.to_string()
33
- } else if let Ok(t) = k.try_convert_to::<RString>() {
34
- t.to_string()
35
- } else {
36
- VM::raise(Class::from_existing("IllegalArgumentError"), "Only strings and symbols are supported as map keys.");
37
- return Boolean::new(false);
38
- };
39
-
40
- let m: &Map = rtself.get_data(&*MAP_WRAPPER);
41
- let result = m.contains(&k2);
42
-
43
- Boolean::new(result)
44
- },
45
- fn ymap_each(block: Proc) -> NilClass {
46
- let b = block.map_err(|e| VM::raise_ex(e)).unwrap();
47
-
48
- let m: &Map = rtself.get_data(&*MAP_WRAPPER);
49
-
50
- m
51
- .iter()
52
- .for_each(|(key, val)| {
53
- let args = [
54
- RString::new_utf8(key).to_any_object(),
55
- map_yrs_value_to_ruby(val)
56
- ];
57
- b.call(&args);
58
- });
59
-
60
- NilClass::new()
61
- },
62
- fn ymap_get(key: AnyObject) -> AnyObject {
63
- let k = key.map_err(|e| VM::raise_ex(e)).unwrap();
64
-
65
- let k2 = if let Ok(t) = k.try_convert_to::<Symbol>() {
66
- t.to_string()
67
- } else if let Ok(t) = k.try_convert_to::<RString>() {
68
- t.to_string()
69
- } else {
70
- VM::raise(Class::from_existing("IllegalArgumentError"), "Only strings and symbols are supported as map keys.");
71
- return NilClass::new().to_any_object();
72
- };
73
-
74
- let m: &Map = rtself.get_data(&*MAP_WRAPPER);
75
- let result = m.get(&k2);
76
-
77
- map_yrs_value_to_ruby(result.unwrap_or(yrs::types::Value::Any(Any::Null)))
78
- },
79
- fn ymap_insert(transaction: YTransaction, key: AnyObject, value: AnyObject) -> AnyObject {
80
- let mut tx = transaction.map_err(|e| VM::raise_ex(e)).unwrap();
81
- let k = key.map_err(|e| VM::raise_ex(e)).unwrap();
82
- let v = value.map_err(|e| VM::raise_ex(e)).unwrap();
83
-
84
- let k2 = if let Ok(t) = k.try_convert_to::<Symbol>() {
85
- t.to_string()
86
- } else if let Ok(t) = k.try_convert_to::<RString>() {
87
- t.to_string()
88
- } else {
89
- VM::raise(Class::from_existing("IllegalArgumentError"), "Only strings and symbols are supported as map keys.");
90
- return NilClass::new().to_any_object();
91
- };
92
-
93
- let txn = tx.get_data_mut(&*TRANSACTION_WRAPPER);
94
-
95
- let m: &Map = rtself.get_data(&*MAP_WRAPPER);
96
-
97
- let result = m.insert(
98
- txn,
99
- Rc::from(k2),
100
- map_ruby_type_to_rust(v).unwrap()
101
- );
102
-
103
- map_yrs_value_to_ruby(result.unwrap_or(yrs::types::Value::Any(Any::Null)))
104
- },
105
- fn ymap_observe(callback: Proc) -> Integer {
106
- let c = callback.map_err(|e| VM::raise_ex(e)).unwrap();
107
-
108
- let map: &mut Map = rtself.get_data_mut(&*MAP_WRAPPER);
109
- let subscription_id: SubscriptionId = map
110
- .observe(move |transaction, map_event| {
111
- let delta = map_event.keys(transaction);
112
- let mut changes: Vec<AnyObject> = Vec::new();
113
-
114
- for (key, change) in delta {
115
- match change {
116
- EntryChange::Inserted(v) => {
117
- let mut h = Hash::new();
118
- h.store(Symbol::new(&key.to_string()), map_yrs_value_to_ruby(v.clone()));
119
-
120
- let mut payload = Hash::new();
121
- payload.store(Symbol::new("inserted"), h);
122
-
123
- changes.push(payload.to_any_object());
124
- },
125
- EntryChange::Updated(old, new) => {
126
- let mut values = Array::with_capacity(2);
127
- values.push(map_yrs_value_to_ruby(old.clone()));
128
- values.push(map_yrs_value_to_ruby(new.clone()));
129
-
130
- let mut h = Hash::new();
131
- h.store(Symbol::new(&key.to_string()), values);
132
-
133
- let mut payload = Hash::new();
134
- payload.store(Symbol::new("updated"), h);
135
-
136
- changes.push(payload.to_any_object());
137
- },
138
- EntryChange::Removed(v) => {
139
- let mut h = Hash::new();
140
- h.store(Symbol::new(&key.to_string()), map_yrs_value_to_ruby(v.clone()));
141
-
142
- let mut payload = Hash::new();
143
- payload.store(Symbol::new("removed"), h);
144
-
145
- changes.push(payload.to_any_object());
146
- }
147
- }
148
- }
149
-
150
- let args = &[Array::from_iter(changes).to_any_object()];
151
- c.call(args);
152
- })
153
- .into();
154
-
155
- Integer::from(subscription_id)
156
- },
157
- fn ymap_remove(transaction: YTransaction, key: AnyObject) -> AnyObject {
158
- let mut tx = transaction.map_err(|e| VM::raise_ex(e)).unwrap();
159
- let k = key.map_err(|e| VM::raise_ex(e)).unwrap();
160
-
161
- let k2 = if let Ok(t) = k.try_convert_to::<Symbol>() {
162
- t.to_string()
163
- } else if let Ok(t) = k.try_convert_to::<RString>() {
164
- t.to_string()
165
- } else {
166
- VM::raise(Class::from_existing("IllegalArgumentError"), "Only strings and symbols are supported as map keys.");
167
- return NilClass::new().to_any_object();
168
- };
169
-
170
- let txn = tx.get_data_mut(&*TRANSACTION_WRAPPER);
171
-
172
- let m: &Map = rtself.get_data(&*MAP_WRAPPER);
173
- let result = m.remove(txn, &k2);
174
-
175
- map_yrs_value_to_ruby(result.unwrap_or(yrs::types::Value::Any(Any::Null)))
176
- },
177
- fn ymap_size() -> Fixnum {
178
- let m: &Map = rtself.get_data(&*MAP_WRAPPER);
179
- Fixnum::new(i64::from(m.len()))
180
- },
181
- fn ymap_to_hash() -> Hash {
182
- let m: &Map = rtself.get_data(&*MAP_WRAPPER);
183
- let mut h = Hash::new();
184
-
185
- for (key, val) in m.iter() {
186
- h.store(Symbol::new(key), map_yrs_value_to_ruby(val));
187
- }
188
-
189
- h
190
- },
191
- fn ymap_unobserve(subscription_id: Integer) -> NilClass {
192
- let s = subscription_id.map_err(|e| VM::raise_ex(e)).unwrap();
193
-
194
- let map: &mut Map = rtself.get_data_mut(&*MAP_WRAPPER);
195
- map.unobserve(s.into());
196
-
197
- NilClass::new()
198
- }
199
- );