rsexp
S-expression parsing and writing in Rust using nom parser combinators.
This implemantion aims at being compatible with OCaml's sexplib. The main type for S-expression is as follows:
pub enum Sexp {
Atom(Vec<u8>),
List(Vec<Sexp>),
}
Reading and Writing Sexp Files
Reading a sexp file can be done by first reading the whole file content and then converting the resulting slice into a Sexp
object as follows:
let contents = std::fs::read(input_filename)?;
let sexp = rsexp::from_slice(&contents)?;
Writing a sexp file can be done by first serializing the data to a buffer then writing this buffer out. Alternatively, the sexp.write(w)?
function can be used to directly output the data to a w
object that implements the Write
trait.
let data = sexp.to_bytes();
std::fs::write(output_filename, data)?;
Conversion to/from Native Types
The OfSexp
and SexpOf
traits define some functions to convert a given type from/to a Sexp
. These traits are implemented for most basic types, including maps. Two associated derive macros can be used to define these traits on structs and enums.
#[derive(OfSexp, SexpOf)]
struct StructXYZ {
x: i64,
y: Option<(i32, i32)>,
z: String,
}
#[derive(OfSexp, SexpOf)]
enum Abc {
A(StructXYZ),
B { x: i64, z: String },
C,
}
let sexp = abc.sexp_of();
let abc: Abc = sexp.of_sexp()?;