This crate provides experimental code generation in several languages for the formats
extracted by serde_reflection
.
The code generated by this crate is meant to be used together with a runtime that defines a particular Serde encoding format.
We currently only support binary formats similar to Bincode.
Together with the library serde_generate
, we provide a simple binary tool to process Serde formats
saved on disk.
Assuming that a serde_reflection::Registry
object has been serialized in a YAML file test.yaml
,
the following command will generate Python class definitions and write them into test.py
.
bash
cargo run -p serde-generate -- --language python3 test.yaml > test.py
See the help message of the tool with --help
for more options.
For testing purposes, we use the Bincode encoding format provided by the
bincode
crate in Rust and
provide an experimental Bincode runtime in Python.
In the following example, we transfer a Test
value from Rust to Python using bincode.
```rust
use serde::{Deserialize, Serialize};
use serde_reflection::{Registry, Samples, Tracer, TracerConfig};
use std::io::Write;
struct Test {
a: Vec
// Obtain the Serde format of Test
.
let mut tracer = Tracer::new(TracerConfig::default());
tracer.trace_type::
// Create Python class definitions. let mut source = Vec::new(); serdegenerate::python3::output(&mut source, ®istry)?; asserteq!( String::fromutf8lossy(&source), r#" from dataclasses import dataclass import typing import serde_types as st
@dataclass class Test: a: typing.Sequence[st.uint64] b: typing.Tuple[st.uint32, st.uint32]
"#.to_string());
// Append some test code to demonstrate Bincode deserialization
// using the runtime in serde_generate/runtime/python/bincode
.
writeln!(
source,
r#"
import bincode
value, _ = bincode.deserialize(bytes.fromhex("{}"), Test) assert value == Test(a=[4, 6], b=(3, 5)) "#, hex::encode(&bincode::serialize(&Test { a: vec![4, 6], b: (3, 5) }).unwrap()), )?;
// Execute the Python code. let mut child = std::process::Command::new("python3") .arg("-") .env("PYTHONPATH", std::env::var("PYTHONPATH").unwrapordefault() + ":runtime/python") .stdin(std::process::Stdio::piped()) .spawn()?; child.stdin.asmut().unwrap().writeall(&source)?; let output = child.waitwithoutput()?; assert!(output.status.success()); ```
See the CONTRIBUTING file for how to help out.
This project is available under the terms of either the Apache 2.0 license or the MIT license.