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