changelog shortlog graph tags branches changeset files revisions annotate raw help

Mercurial > core / rust/lib/sxp/src/lib.rs

changeset 698: 96958d3eb5b0
parent: 0ccbbd142694
author: Richard Westhaver <ellis@rwest.io>
date: Fri, 04 Oct 2024 22:04:59 -0400
permissions: -rw-r--r--
description: fixes
1 //! lib.rs --- S-eXPressions.
2 #![cfg_attr(not(feature = "std"), no_std)]
3 extern crate alloc;
4 
5 mod err;
6 #[doc(inline)]
7 pub use err::{Error, Result};
8 
9 mod io;
10 
11 macro_rules! e {
12  ($e:expr $(,)?) => {
13  match $e {
14  core::result::Result::Ok(val) => val,
15  core::result::Result::Err(err) => return core::result::Result::Err(err),
16  }
17  };
18 }
19 
20 // pub mod de;
21 // pub use crate::de::{
22 // from_reader, from_slice, from_str, from_traits, Deserializer,
23 // };
24 
25 pub mod fmt;
26 #[doc(inline)]
27 pub use fmt::{DefaultFormatter, Formatter, ReadFormatter, WriteFormatter};
28 pub mod form;
29 pub mod iter;
30 pub mod macs;
31 pub mod read;
32 pub mod ser;
33 pub mod tok;
34 #[doc(inline)]
35 pub use form::Form;
36 #[doc(inline)]
37 pub use macs::{Macro, MacroObject, ReadTable, WriteTable};
38 #[doc(inline)]
39 pub use ser::{to_string, to_vec, to_writer, Serializer};
40 #[doc(inline)]
41 pub use tok::Token;
42 
43 #[macro_export(local_inner_macros)]
44 macro_rules! sxp {
45  ($($sxp:tt)+) => {
46  _sxp!($($sxp)+)
47  };
48 }
49 
50 // may not be necessary
51 #[macro_export(local_inner_macros)]
52 #[doc(hidden)]
53 macro_rules! _sxp {
54  (@array [$($elems:expr),*]) => {
55  sxp_vec![$($elems),*]
56  };
57  // Next element is `nil`.
58  (@array [$($elems:expr,)*] nil $($rest:tt)*) => {
59  _sxp!(@array [$($elems,)* _sxp!(nil)] $($rest)*)
60  };
61  // Unexpected token after most recent element.
62  (@array [$($elems:expr),*] $unexpected:tt $($rest:tt)*) => {
63  sxp_unexpected!($unexpected)
64  };
65 
66  //////////////////////////////////////////////////////////////////////////
67  // TT muncher for parsing the inside of a object (:foo "bar"). Each entry is
68  // inserted into the given map variable.
69  //
70  // Must be invoked as: _sxp!(@object $map () ($($tt)*) ($($tt)*))
71  //
72  // We require two copies of the input tokens so that we can match on one
73  // copy and trigger errors on the other copy.
74  //////////////////////////////////////////////////////////////////////////
75 
76  // Done.
77  (@object $object:ident () () ()) => {};
78 
79  // Insert the current entry.
80  (@object $object:ident ( [$($key:tt)+] ($value:expr) ) $($rest:tt)*) => {
81  let _ = $object.insert(($($key)+).into(), $value);
82  _sxp!(@object $object () ($($rest)*) ($($rest)*));
83  };
84 
85  // Current entry followed by unexpected token.
86  (@object $object:ident [$($key:tt)+] ($value:expr) $unexpected:tt $($rest:tt)*) => {
87  sxp_unexpected!($unexpected);
88  };
89 
90  // Insert the last entry
91  (@object $object:ident [$($key:tt)+] ($value:expr)) => {
92  let _ = $object.insert(($($key)+).into(), $value);
93  };
94 
95  // Next value is `nil`.
96  (@object $object:ident ($($key:tt)+) (nil $($rest:tt)*) $copy:tt) => {
97  json_internal!(@object $object [$($key)+] (json_internal!(null)) $($rest)*);
98  };
99 
100 }