py-rs 0.1.1

generate python bindings from rust types
Documentation
#![allow(dead_code)]

use serde::Serialize;
use py_rs::PY;

#[derive(Serialize, PY)]
#[py(export, export_to = "optional_field/")]
struct OptionalInStruct {
    #[py(optional)]
    a: Option<i32>,
    #[py(optional = nullable)]
    b: Option<i32>,
    c: Option<i32>,
}

#[test]
fn in_struct() {
    let a = "a?: number";
    let b = "b?: number | null";
    let c = "c: number | null";
    assert_eq!(OptionalInStruct::inline(), format!("{{ {a}, {b}, {c}, }}"));
}

#[derive(Serialize, PY)]
#[py(export, export_to = "optional_field/")]
enum OptionalInEnum {
    A {
        #[py(optional)]
        a: Option<i32>,
    },
    B {
        b: Option<String>,
    },
}

#[test]
fn in_enum() {
    assert_eq!(
        OptionalInEnum::inline(),
        r#"{ "A": { a?: number, } } | { "B": { b: string | null, } }"#
    );
}

#[derive(Serialize, PY)]
#[py(export, export_to = "optional_field/")]
struct OptionalFlatten {
    #[py(optional)]
    a: Option<i32>,
    #[py(optional = nullable)]
    b: Option<i32>,
    c: Option<i32>,
}

#[derive(Serialize, PY)]
#[py(export, export_to = "optional_field/")]
struct Flatten {
    #[py(flatten)]
    x: OptionalFlatten,
}

#[test]
fn flatten() {
    assert_eq!(Flatten::inline(), OptionalFlatten::inline());
}

#[derive(Serialize, PY)]
#[py(export, export_to = "optional_field/")]
struct OptionalInline {
    #[py(optional)]
    a: Option<i32>,
    #[py(optional = nullable)]
    b: Option<i32>,
    c: Option<i32>,
}

#[derive(Serialize, PY)]
#[py(export, export_to = "optional_field/")]
struct Inline {
    #[py(inline)]
    x: OptionalInline,
}

#[test]
fn inline() {
    let a = "a?: number";
    let b = "b?: number | null";
    let c = "c: number | null";
    assert_eq!(Inline::inline(), format!("{{ x: {{ {a}, {b}, {c}, }}, }}"));
}