use sml::{SmlDeserialize, SmlSerialize};
#[derive(SmlSerialize, SmlDeserialize, Debug)]
struct Server {
host: String,
#[sml(default)]
port: i32,
#[sml(rename = "tls-enabled")]
tls_enabled: bool,
#[sml(skip)]
secret: String,
upstream: Option<String>,
}
#[derive(SmlSerialize, SmlDeserialize, Debug)]
enum Status {
Active,
#[sml(rename = "stand-by")]
StandBy,
}
#[derive(SmlSerialize, SmlDeserialize, Debug)]
enum Shape {
Circle(f64),
Rect { w: f64, h: f64 },
}
fn main() {
let server = Server {
host: "web.example".into(),
port: 8080,
tls_enabled: true,
secret: "hunter2".into(),
upstream: None,
};
let _ = &server.secret;
let text = server.to_sml();
println!("== 序列化 ==");
println!("{text}");
let back = Server::from_sml(&text).expect("反序列化失败");
println!("== 反序列化 ==");
println!("{back:?}");
println!("\nstatus: {}", Status::Active.to_sml());
println!("shape: {}", Shape::Circle(3.0).to_sml());
println!("rect: {}", Shape::Rect { w: 4.0, h: 5.0 }.to_sml());
let v = server.to_sml_value();
println!("\n== Value ==");
println!("{v:?}");
}