py-rs 0.1.1

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

use py_rs::PY;

#[derive(PY)]
#[py(export, export_to = "struct_rename/", rename_all = "UPPERCASE")]
struct RenameAllUpper {
    a: i32,
    b: i32,
}

#[test]
fn rename_all() {
    assert_eq!(RenameAllUpper::inline(), "{ A: number, B: number, }");
}

#[derive(PY)]
#[py(export, export_to = "struct_rename/", rename_all = "camelCase")]
struct RenameAllCamel {
    crc32c_hash: i32,
    b: i32,
    alreadyCamelCase: i32,
}

#[test]
fn rename_all_camel_case() {
    assert_eq!(
        RenameAllCamel::inline(),
        "{ crc32cHash: number, b: number, alreadyCamelCase: number, }"
    );
}

#[derive(PY)]
#[py(export, export_to = "struct_rename/", rename_all = "PascalCase")]
struct RenameAllPascal {
    crc32c_hash: i32,
    b: i32,
}

#[test]
fn rename_all_pascal_case() {
    assert_eq!(
        RenameAllPascal::inline(),
        "{ Crc32cHash: number, B: number, }"
    );
}

#[derive(PY, Default, serde::Serialize)]
#[py(export, export_to = "struct_rename/")]
#[cfg_attr(feature = "serde-compat", serde(rename_all = "SCREAMING-KEBAB-CASE"))]
#[cfg_attr(not(feature = "serde-compat"), py(rename_all = "SCREAMING-KEBAB-CASE"))]
struct RenameAllScreamingKebab {
    crc32c_hash: i32,
    some_field: i32,
    some_other_field: i32,
}

#[test]
fn rename_all_screaming_kebab_case() {
    let rename_all = RenameAllScreamingKebab::default();
    assert_eq!(
        RenameAllScreamingKebab::inline(),
        r#"{ "CRC32C-HASH": number, "SOME-FIELD": number, "SOME-OTHER-FIELD": number, }"#
    );
}

#[derive(serde::Serialize, PY)]
#[py(export, export_to = "struct_rename/", rename_all = "camelCase")]
struct RenameSerdeSpecialChar {
    #[serde(rename = "a/b")]
    b: i32,
}

#[cfg(feature = "serde-compat")]
#[test]
fn serde_rename_special_char() {
    assert_eq!(RenameSerdeSpecialChar::inline(), r#"{ "a/b": number, }"#);
}