1use std::collections::HashMap;
2use std::hash::Hash;
3use std::str::Chars;
4use makepad_live_id::LiveId;
5
6pub struct SerRonState {
7 pub out: String
8}
9
10impl SerRonState {
11 pub fn indent(&mut self, d: usize) {
12 for _ in 0..d {
13 self.out.push_str(" ");
14 }
15 }
16
17 pub fn field(&mut self, d: usize, field: &str) {
18 self.indent(d);
19 self.out.push_str(field);
20 self.out.push(':');
21 }
22
23 pub fn conl(&mut self) {
24 self.out.push_str(",\n")
25 }
26
27 pub fn st_pre(&mut self) {
28 self.out.push_str("(\n");
29 }
30
31 pub fn st_post(&mut self, d: usize) {
32 self.indent(d);
33 self.out.push(')');
34 }
35
36}
37
38pub trait SerRon {
39
40 fn serialize_ron(&self) -> String {
41 let mut s = SerRonState {
42 out: String::new()
43 };
44 self.ser_ron(0, &mut s);
45 s.out
46 }
47
48 fn ser_ron(&self, d: usize, s: &mut SerRonState);
49}
50
51pub trait DeRon: Sized {
52
53 fn deserialize_ron(input: &str) -> Result<Self,
54 DeRonErr> {
55 let mut state = DeRonState::default();
56 let mut chars = input.chars();
57 state.next(&mut chars);
58 state.next_tok(&mut chars) ?;
59 DeRon::de_ron(&mut state, &mut chars)
60 }
61
62 fn de_ron(s: &mut DeRonState, i: &mut Chars) -> Result<Self,
63 DeRonErr>;
64}
65
66#[derive(PartialEq, Debug)]
67#[derive(Default)]
68pub enum DeRonTok {
69 Ident,
70 Str,
71 U64(u64),
72 I64(i64),
73 F64(f64),
74 Bool(bool),
75 Char(char),
76 Colon,
77 CurlyOpen,
78 CurlyClose,
79 ParenOpen,
80 ParenClose,
81 BlockOpen,
82 BlockClose,
83 Comma,
84 #[default]
85 Bof,
86 Eof
87}
88
89
90
91#[derive(Default)]
92pub struct DeRonState {
93 pub cur: char,
94 pub tok: DeRonTok,
95 pub strbuf: String,
96 pub numbuf: String,
97 pub identbuf: String,
98 pub line: usize,
99 pub col: usize
100}
101
102pub struct DeRonErr {
103 pub msg: String,
104 pub line: usize,
105 pub col: usize
106}
107
108impl std::fmt::Debug for DeRonErr {
109 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
110 write!(f, "Ron Deserialize error: {}, line:{} col:{}", self.msg, self.line + 1, self.col + 1)
111 }
112}
113
114impl DeRonState {
115 pub fn next(&mut self, i: &mut Chars) {
116 if let Some(c) = i.next() {
117 self.cur = c;
118 if self.cur == '\n' {
119 self.line += 1;
120 self.col = 0;
121 }
122 else {
123 self.col = 0;
124 }
125 }
126 else {
127 self.cur = '\0';
128 }
129 }
130
131 pub fn err_exp(&self, name: &str) -> DeRonErr {
132 DeRonErr {msg: format!("Unexpected key {}", name), line: self.line, col: self.col}
133 }
134
135 pub fn err_nf(&self, name: &str) -> DeRonErr {
136 DeRonErr {msg: format!("Key not found {}", name), line: self.line, col: self.col}
137 }
138
139 pub fn err_enum(&self, name: &str) -> DeRonErr {
140 DeRonErr {msg: format!("Enum not defined {}", name), line: self.line, col: self.col}
141 }
142
143 pub fn err_token(&self, what: &str) -> DeRonErr {
144 DeRonErr {msg: format!("Unexpected token {:?} expected {} ", self.tok, what), line: self.line, col: self.col}
145 }
146
147 pub fn err_range(&self, what: &str) -> DeRonErr {
148 DeRonErr {msg: format!("Value out of range {} ", what), line: self.line, col: self.col}
149 }
150
151 pub fn err_type(&self, what: &str) -> DeRonErr {
152 DeRonErr {msg: format!("Token wrong type {} ", what), line: self.line, col: self.col}
153 }
154
155 pub fn err_parse(&self, what: &str) -> DeRonErr {
156 DeRonErr {msg: format!("Cannot parse {} ", what), line: self.line, col: self.col}
157 }
158
159 pub fn eat_comma_paren(&mut self, i: &mut Chars) -> Result<(), DeRonErr> {
160 match self.tok {
161 DeRonTok::Comma => {
162 self.next_tok(i) ?;
163 Ok(())
164 },
165 DeRonTok::ParenClose => {
166 Ok(())
167 }
168 _ => {
169 Err(self.err_token(", or )"))
170 }
171 }
172 }
173
174 pub fn eat_comma_block(&mut self, i: &mut Chars) -> Result<(), DeRonErr> {
175 match self.tok {
176 DeRonTok::Comma => {
177 self.next_tok(i) ?;
178 Ok(())
179 },
180 DeRonTok::BlockClose => {
181 Ok(())
182 }
183 _ => {
184 Err(self.err_token(", or ]"))
185 }
186 }
187 }
188
189 pub fn eat_comma_curly(&mut self, i: &mut Chars) -> Result<(), DeRonErr> {
190 match self.tok {
191 DeRonTok::Comma => {
192 self.next_tok(i) ?;
193 Ok(())
194 },
195 DeRonTok::CurlyClose => {
196 Ok(())
197 }
198 _ => {
199 Err(self.err_token(", or }"))
200 }
201 }
202 }
203
204 pub fn colon(&mut self, i: &mut Chars) -> Result<(), DeRonErr> {
205 match self.tok {
206 DeRonTok::Colon => {
207 self.next_tok(i) ?;
208 Ok(())
209 },
210 _ => {
211 Err(self.err_token(":"))
212 }
213 }
214 }
215
216 pub fn ident(&mut self, i: &mut Chars) -> Result<(), DeRonErr> {
217 match &mut self.tok {
218 DeRonTok::Ident => {
219 self.next_tok(i) ?;
220 Ok(())
221 },
222 _ => {
223 Err(self.err_token("Identifier"))
224 }
225 }
226 }
227
228 pub fn next_colon(&mut self, i: &mut Chars) -> Result<(), DeRonErr> {
229 self.next_tok(i) ?;
230 self.colon(i) ?;
231 Ok(())
232 }
233
234 pub fn next_ident(&mut self) -> Option<()> {
235 if let DeRonTok::Ident = &mut self.tok {
236 Some(())
237 }
238 else {
239 None
240 }
241 }
242
243 pub fn paren_open(&mut self, i: &mut Chars) -> Result<(), DeRonErr> {
244 if self.tok == DeRonTok::ParenOpen {
245 self.next_tok(i) ?;
246 return Ok(())
247 }
248 Err(self.err_token("("))
249 }
250
251
252 pub fn paren_close(&mut self, i: &mut Chars) -> Result<(), DeRonErr> {
253 if self.tok == DeRonTok::ParenClose {
254 self.next_tok(i) ?;
255 return Ok(())
256 }
257 Err(self.err_token(")"))
258 }
259
260 pub fn block_open(&mut self, i: &mut Chars) -> Result<(), DeRonErr> {
261 if self.tok == DeRonTok::BlockOpen {
262 self.next_tok(i) ?;
263 return Ok(())
264 }
265 Err(self.err_token("["))
266 }
267
268
269 pub fn block_close(&mut self, i: &mut Chars) -> Result<(), DeRonErr> {
270 if self.tok == DeRonTok::BlockClose {
271 self.next_tok(i) ?;
272 return Ok(())
273 }
274 Err(self.err_token("]"))
275 }
276
277 pub fn curly_open(&mut self, i: &mut Chars) -> Result<(), DeRonErr> {
278 if self.tok == DeRonTok::CurlyOpen {
279 self.next_tok(i) ?;
280 return Ok(())
281 }
282 Err(self.err_token("{"))
283 }
284
285
286 pub fn curly_close(&mut self, i: &mut Chars) -> Result<(), DeRonErr> {
287 if self.tok == DeRonTok::CurlyClose {
288 self.next_tok(i) ?;
289 return Ok(())
290 }
291 Err(self.err_token("}"))
292 }
293
294
295 pub fn u64_range(&mut self, max: u64) -> Result<u64, DeRonErr> {
296 if let DeRonTok::U64(value) = self.tok {
297 if value > max {
298 return Err(self.err_range(&format!("{}>{}", value, max)))
299 }
300 return Ok(value)
301 }
302 Err(self.err_token("unsigned integer"))
303 }
304
305 pub fn i64_range(&mut self, min: i64, max: i64) -> Result<i64, DeRonErr> {
306 if let DeRonTok::I64(value) = self.tok {
307 if value< min {
308 return Err(self.err_range(&format!("{}<{}", value, min)))
309 }
310 return Ok(value)
311 }
312 if let DeRonTok::U64(value) = self.tok {
313 if value as i64 > max {
314 return Err(self.err_range(&format!("{}>{}", value, max)))
315 }
316 return Ok(value as i64)
317 }
318 Err(self.err_token("signed integer"))
319 }
320
321 pub fn as_f64(&mut self) -> Result<f64, DeRonErr> {
322 if let DeRonTok::I64(value) = self.tok {
323 return Ok(value as f64)
324 }
325 if let DeRonTok::U64(value) = self.tok {
326 return Ok(value as f64)
327 }
328 if let DeRonTok::F64(value) = self.tok {
329 return Ok(value)
330 }
331 Err(self.err_token("floating point"))
332 }
333
334 pub fn as_bool(&mut self) -> Result<bool, DeRonErr> {
335 if let DeRonTok::Bool(value) = self.tok {
336 return Ok(value)
337 }
338 if let DeRonTok::U64(value) = self.tok {
339 return Ok(value != 0)
340 }
341 Err(self.err_token("boolean"))
342 }
343
344 pub fn as_string(&mut self) -> Result<String, DeRonErr> {
345 if let DeRonTok::Str = &mut self.tok {
346 let mut val = String::new();
347 std::mem::swap(&mut val, &mut self.strbuf);
348 return Ok(val)
349 }
350 Err(self.err_token("string"))
351 }
352
353 pub fn next_tok(&mut self, i: &mut Chars) -> Result<(), DeRonErr> {
354 loop {
355 while self.cur == '\n' || self.cur == '\r' || self.cur == '\t' || self.cur == ' ' {
356 self.next(i);
357 }
358 match self.cur {
359 '\0' => {
360 self.tok = DeRonTok::Eof;
361 return Ok(())
362 },
363 ':' => {
364 self.next(i);
365 self.tok = DeRonTok::Colon;
366 return Ok(())
367 }
368 ',' => {
369 self.next(i);
370 self.tok = DeRonTok::Comma;
371 return Ok(())
372 }
373 '[' => {
374 self.next(i);
375 self.tok = DeRonTok::BlockOpen;
376 return Ok(())
377 }
378 ']' => {
379 self.next(i);
380 self.tok = DeRonTok::BlockClose;
381 return Ok(())
382 }
383 '(' => {
384 self.next(i);
385 self.tok = DeRonTok::ParenOpen;
386 return Ok(())
387 }
388 ')' => {
389 self.next(i);
390 self.tok = DeRonTok::ParenClose;
391 return Ok(())
392 }
393 '{' => {
394 self.next(i);
395 self.tok = DeRonTok::CurlyOpen;
396 return Ok(())
397 }
398 '}' => {
399 self.next(i);
400 self.tok = DeRonTok::CurlyClose;
401 return Ok(())
402 }
403 '/' => {
404 self.next(i);
405 if self.cur == '/' { while self.cur != '\0' {
407 if self.cur == '\n' {
408 self.next(i);
409 break;
410 }
411 self.next(i);
412 }
413 }
414 else if self.cur == '*' { let mut last_star = false;
416 while self.cur != '\0' {
417 if self.cur == '/' && last_star {
418 self.next(i);
419 break;
420 }
421 last_star = self.cur == '*';
422 self.next(i);
423 }
424 }
425 else {
426 return Err(self.err_parse("comment"));
427 }
428 },
429 '-' | '0'..='9' => {
430 self.numbuf.clear();
431 let is_neg = if self.cur == '-' {
432 self.numbuf.push(self.cur);
433 self.next(i);
434 true
435 }
436 else {
437 false
438 };
439 while self.cur >= '0' && self.cur <= '9' {
440 self.numbuf.push(self.cur);
441 self.next(i);
442 }
443 if self.cur == '.' {
444 self.numbuf.push(self.cur);
445 self.next(i);
446 while self.cur >= '0' && self.cur <= '9' {
447 self.numbuf.push(self.cur);
448 self.next(i);
449 }
450 if let Ok(num) = self.numbuf.parse() {
451 self.tok = DeRonTok::F64(num);
452 return Ok(())
453 }
454 else {
455 return Err(self.err_parse("number"));
456 }
457 }
458 else {
459 if is_neg {
460 if let Ok(num) = self.numbuf.parse() {
461 self.tok = DeRonTok::I64(num);
462 return Ok(())
463 }
464 else {
465 return Err(self.err_parse("number"));
466 }
467 }
468 if let Ok(num) = self.numbuf.parse() {
469 self.tok = DeRonTok::U64(num);
470 return Ok(())
471 }
472 else {
473 return Err(self.err_parse("number"));
474 }
475 }
476 },
477 'a'..='z' | 'A'..='Z' | '_' => {
478 self.identbuf.clear();
479 self.identbuf.push(self.cur);
480 self.next(i);
481
482 while self.cur >= 'a' && self.cur <= 'z'
483 || self.cur >= 'A' && self.cur <= 'Z'
484 || self.cur == '_' ||
485 self.cur >= '0' && self.cur <='9' {
486 self.identbuf.push(self.cur);
487 self.next(i);
488 }
489 if self.identbuf == "true" {
490 self.tok = DeRonTok::Bool(true);
491 return Ok(())
492 }
493 if self.identbuf == "false" {
494 self.tok = DeRonTok::Bool(false);
495 return Ok(())
496 }
497 self.tok = DeRonTok::Ident;
498 return Ok(())
499 },
500 '\'' => {
501 self.next(i);
502 if self.cur == '\\' {
503 self.next(i);
504 }
505 let chr = self.cur;
506 self.next(i);
507 if self.cur != '\'' {
508 return Err(self.err_token("char"));
509 }
510 self.next(i);
511 self.tok = DeRonTok::Char(chr);
512 },
513 '"' => {
514 self.strbuf.clear();
515 self.next(i);
516 while self.cur != '"' {
517 if self.cur == '\\' {
518 self.next(i);
519 match self.cur {
520 'n' => self.strbuf.push('\n'),
521 'r' => self.strbuf.push('\r'),
522 't' => self.strbuf.push('\t'),
523 '0' => self.strbuf.push('\0'),
524 '\0' => {
525 return Err(self.err_parse("string"));
526 },
527 _ => self.strbuf.push(self.cur)
528 }
529 self.next(i);
530 }
531 else{
532 if self.cur == '\0' {
533 return Err(self.err_parse("string"));
534 }
535 self.strbuf.push(self.cur);
536 self.next(i);
537 }
538 }
539 self.next(i);
540 self.tok = DeRonTok::Str;
541 return Ok(())
542 },
543 _ => {
544 return Err(self.err_token("tokenizer"));
545 }
546 }
547 }
548 }
549}
550
551macro_rules!impl_ser_de_ron_unsigned {
552 ( $ ty: ident, $ max: expr) => {
553 impl SerRon for $ ty {
554 fn ser_ron(&self, _d: usize, s: &mut SerRonState) {
555 s.out.push_str(&self.to_string());
556 }
557 }
558
559 impl DeRon for $ ty {
560 fn de_ron(s: &mut DeRonState, i: &mut Chars) -> Result< $ ty,
561 DeRonErr> {
562 let val = s.u64_range( $ max as u64) ?;
564 s.next_tok(i) ?;
565 return Ok(val as $ ty);
566 }
567 }
568 }
569}
570
571macro_rules!impl_ser_de_ron_signed {
572 ( $ ty: ident, $ min: expr, $ max: expr) => {
573 impl SerRon for $ ty {
574 fn ser_ron(&self, _d: usize, s: &mut SerRonState) {
575 s.out.push_str(&self.to_string());
576 }
577 }
578
579 impl DeRon for $ ty {
580 fn de_ron(s: &mut DeRonState, i: &mut Chars) -> Result< $ ty,
581 DeRonErr> {
582 let val = s.i64_range( $ min as i64, $ max as i64) ?;
584 s.next_tok(i) ?;
585 return Ok(val as $ ty);
586 }
587 }
588 }
589}
590
591macro_rules!impl_ser_de_ron_float {
592 ( $ ty: ident) => {
593 impl SerRon for $ ty {
594 fn ser_ron(&self, _d: usize, s: &mut SerRonState) {
595 s.out.push_str(&self.to_string());
596 }
597 }
598
599 impl DeRon for $ ty {
600 fn de_ron(s: &mut DeRonState, i: &mut Chars) -> Result< $ ty,
601 DeRonErr> {
602 let val = s.as_f64() ?;
604 s.next_tok(i) ?;
605 return Ok(val as $ ty);
606 }
607 }
608 }
609}
610
611impl_ser_de_ron_unsigned!(usize, std::usize::MAX);
612impl_ser_de_ron_unsigned!(u64, std::u64::MAX);
613impl_ser_de_ron_unsigned!(u32, std::u32::MAX);
614impl_ser_de_ron_unsigned!(u16, std::u16::MAX);
615impl_ser_de_ron_unsigned!(u8, std::u8::MAX);
616impl_ser_de_ron_signed!(i64, std::i64::MIN, std::i64::MAX);
617impl_ser_de_ron_signed!(i32, std::i64::MIN, std::i64::MAX);
618impl_ser_de_ron_signed!(i16, std::i64::MIN, std::i64::MAX);
619impl_ser_de_ron_signed!(i8, std::i64::MIN, std::i8::MAX);
620impl_ser_de_ron_float!(f64);
621impl_ser_de_ron_float!(f32);
622
623impl<T> SerRon for Option<T> where T: SerRon {
624 fn ser_ron(&self, d: usize, s: &mut SerRonState) {
625 if let Some(v) = self {
626 v.ser_ron(d, s);
627 }
628 else {
629 s.out.push_str("None");
630 }
631 }
632}
633
634impl<T> DeRon for Option<T> where T: DeRon {
635 fn de_ron(s: &mut DeRonState, i: &mut Chars) -> Result<Self,
636 DeRonErr> {
637 if let DeRonTok::Ident = &s.tok {
638 if s.identbuf == "None" {
639 s.next_tok(i) ?;
640 return Ok(None)
641 }
642 }
643 Ok(Some(DeRon::de_ron(s, i) ?))
644 }
645}
646
647impl SerRon for bool {
648 fn ser_ron(&self, _d: usize, s: &mut SerRonState) {
649 if *self {
650 s.out.push_str("true")
651 }
652 else {
653 s.out.push_str("false")
654 }
655 }
656}
657
658impl DeRon for bool {
659 fn de_ron(s: &mut DeRonState, i: &mut Chars) -> Result<bool, DeRonErr> {
660 let val = s.as_bool() ?;
661 s.next_tok(i) ?;
662 Ok(val)
663 }
664}
665
666impl SerRon for String {
667 fn ser_ron(&self, _d: usize, s: &mut SerRonState) {
668 s.out.push('"');
669 for c in self.chars() {
670 match c {
671 '\n' => {s.out.push('\\'); s.out.push('n');},
672 '\r' => {s.out.push('\\'); s.out.push('r');},
673 '\t' => {s.out.push('\\'); s.out.push('t');},
674 '\0' => {s.out.push('\\'); s.out.push('0');},
675 '\\' => {s.out.push('\\'); s.out.push('\\');},
676 '"' => {s.out.push('\\'); s.out.push('"');},
677 _ => s.out.push(c)
678 }
679 }
680 s.out.push('"');
681 }
682}
683
684impl DeRon for String {
685 fn de_ron(s: &mut DeRonState, i: &mut Chars) -> Result<String, DeRonErr> {
686 let val = s.as_string() ?;
687 s.next_tok(i) ?;
688 Ok(val)
689 }
690}
691
692impl<T> SerRon for Vec<T> where T: SerRon {
693 fn ser_ron(&self, d: usize, s: &mut SerRonState) {
694 s.out.push_str("[\n");
695 for item in self {
696 s.indent(d + 1);
697 item.ser_ron(d + 1, s);
698 s.conl();
699 }
700 s.indent(d);
701 s.out.push(']');
702 }
703}
704
705impl<T> DeRon for Vec<T> where T: DeRon {
706 fn de_ron(s: &mut DeRonState, i: &mut Chars) -> Result<Vec<T>, DeRonErr> {
707 let mut out = Vec::new();
708 s.block_open(i) ?;
709
710 while s.tok != DeRonTok::BlockClose {
711 out.push(DeRon::de_ron(s, i) ?);
712 s.eat_comma_block(i) ?;
713 }
714 s.block_close(i) ?;
715 Ok(out)
716 }
717}
718
719impl<T> SerRon for [T] where T: SerRon {
720 fn ser_ron(&self, d: usize, s: &mut SerRonState) {
721 s.out.push('(');
722 let last = self.len() - 1;
723 for (index, item) in self.iter().enumerate() {
724 item.ser_ron(d + 1, s);
725 if index != last {
726 s.out.push_str(", ");
727 }
728 }
729 s.out.push(')');
730 }
731}
732
733unsafe fn de_ron_array_impl_inner<T>(top: *mut T, count: usize, s: &mut DeRonState, i: &mut Chars) -> Result<(), DeRonErr> where T: DeRon {
734 s.paren_open(i) ?;
735 for c in 0..count {
736 top.add(c).write(DeRon::de_ron(s, i) ?);
737 s.eat_comma_paren(i) ?;
738 }
739 s.paren_close(i) ?;
740 Ok(())
741}
742
743impl<T, const N: usize> DeRon for [T; N] where T: DeRon {
744 fn de_ron(s: &mut DeRonState, i: &mut Chars) -> Result<Self,
745 DeRonErr> {
746 unsafe {
747 let mut to = std::mem::MaybeUninit::<[T; N]>::uninit();
748 let top: *mut T = &mut to as *mut _ as *mut T;
749 de_ron_array_impl_inner(top, N, s, i) ?;
750 Ok(to.assume_init())
751 }
752 }
753}
754
755fn de_ron_comma_paren<T>(s: &mut DeRonState, i: &mut Chars) -> Result<T, DeRonErr> where T: DeRon {
756 let t = DeRon::de_ron(s, i);
757 s.eat_comma_paren(i) ?;
758 t
759}
760
761impl<A, B> SerRon for (A, B) where A: SerRon,
762B: SerRon {
763 fn ser_ron(&self, d: usize, s: &mut SerRonState) {
764 s.out.push('(');
765 self.0.ser_ron(d, s);
766 s.out.push_str(", ");
767 self.1.ser_ron(d, s);
768 s.out.push(')');
769 }
770}
771
772impl<A, B> DeRon for (A, B) where A: DeRon,
773B: DeRon {
774 fn de_ron(s: &mut DeRonState, i: &mut Chars) -> Result<(A, B), DeRonErr> {
775 s.paren_open(i) ?;
776 let r = (de_ron_comma_paren(s, i) ?, de_ron_comma_paren(s, i) ?);
777 s.paren_close(i) ?;
778 Ok(r)
779 }
780}
781
782impl<A, B, C> SerRon for (A, B, C) where A: SerRon,
783B: SerRon,
784C: SerRon {
785 fn ser_ron(&self, d: usize, s: &mut SerRonState) {
786 s.out.push('(');
787 self.0.ser_ron(d, s);
788 s.out.push_str(", ");
789 self.1.ser_ron(d, s);
790 s.out.push_str(", ");
791 self.2.ser_ron(d, s);
792 s.out.push(')');
793 }
794}
795
796impl<A, B, C> DeRon for (A, B, C) where A: DeRon,
797B: DeRon,
798C: DeRon {
799 fn de_ron(s: &mut DeRonState, i: &mut Chars) -> Result<(A, B, C), DeRonErr> {
800 s.paren_open(i) ?;
801 let r = (de_ron_comma_paren(s, i) ?, de_ron_comma_paren(s, i) ?, de_ron_comma_paren(s, i) ?);
802 s.paren_close(i) ?;
803 Ok(r)
804 }
805}
806
807impl<A, B, C, D> SerRon for (A, B, C, D) where A: SerRon,
808B: SerRon,
809C: SerRon,
810D: SerRon {
811 fn ser_ron(&self, d: usize, s: &mut SerRonState) {
812 s.out.push('(');
813 self.0.ser_ron(d, s);
814 s.out.push_str(", ");
815 self.1.ser_ron(d, s);
816 s.out.push_str(", ");
817 self.2.ser_ron(d, s);
818 s.out.push_str(", ");
819 self.3.ser_ron(d, s);
820 s.out.push(')');
821 }
822}
823
824impl<A, B, C, D> DeRon for (A, B, C, D) where A: DeRon,
825B: DeRon,
826C: DeRon,
827D: DeRon {
828 fn de_ron(s: &mut DeRonState, i: &mut Chars) -> Result<(A, B, C, D), DeRonErr> {
829 s.paren_open(i) ?;
830 let r = (de_ron_comma_paren(s, i) ?, de_ron_comma_paren(s, i) ?, de_ron_comma_paren(s, i) ?, de_ron_comma_paren(s, i) ?);
831 s.paren_close(i) ?;
832 Ok(r)
833 }
834}
835
836impl<K, V> SerRon for HashMap<K, V> where K: SerRon,
837V: SerRon {
838 fn ser_ron(&self, d: usize, s: &mut SerRonState) {
839 s.out.push_str("{\n");
840 for (k, v) in self {
841 s.indent(d + 1);
842 k.ser_ron(d + 1, s);
843 s.out.push(':');
844 v.ser_ron(d + 1, s);
845 s.conl();
846 }
847 s.indent(d);
848 s.out.push('}');
849 }
850}
851
852impl<K, V> DeRon for HashMap<K, V> where K: DeRon + Eq + Hash,
853V: DeRon {
854 fn de_ron(s: &mut DeRonState, i: &mut Chars) -> Result<Self,
855 DeRonErr> {
856 let mut h = HashMap::new();
857 s.curly_open(i) ?;
858 while s.tok != DeRonTok::CurlyClose {
859 let k = DeRon::de_ron(s, i) ?;
860 s.colon(i) ?;
861 let v = DeRon::de_ron(s, i) ?;
862 s.eat_comma_curly(i) ?;
863 h.insert(k, v);
864 }
865 s.curly_close(i) ?;
866 Ok(h)
867 }
868}
869
870impl<T> SerRon for Box<T> where T: SerRon {
871 fn ser_ron(&self, d: usize, s: &mut SerRonState) {
872 (**self).ser_ron(d, s)
873 }
874}
875
876impl<T> DeRon for Box<T> where T: DeRon {
877 fn de_ron(s: &mut DeRonState, i: &mut Chars) -> Result<Box<T>, DeRonErr> {
878 Ok(Box::new(DeRon::de_ron(s, i) ?))
879 }
880}
881
882#[derive(Clone, Debug, PartialEq, Eq, Hash)]
883pub struct LiveIdRon(pub LiveId);
884
885impl SerRon for LiveId {
886 fn ser_ron(&self, _d: usize, s: &mut SerRonState) {
887 self.as_string(|v|{
888 if let Some(v) = v{
889 s.out.push_str(v);
890 }
891 else{
892 s.out.push_str(&self.0.to_string());
893 }
894 });
895 }
896}
897
898impl DeRon for LiveId {
899 fn de_ron(s: &mut DeRonState, i: &mut Chars) -> Result<LiveId, DeRonErr> {
900 let liveid = match s.tok{
901 DeRonTok::U64(value)=>LiveId(value),
902 DeRonTok::I64(value)=>LiveId(value as u64),
903 DeRonTok::F64(value)=>LiveId(value as u64),
904 DeRonTok::Ident=>{
905 LiveId::from_str_with_lut(&s.identbuf).unwrap()
906 }
907 _=>{ return Err(s.err_token("liveid"))
909 }
910 };
911 s.next_tok(i) ?;
912 Ok(liveid)
913 }
914}
915