tsify 0.4.3

Tsify is a library for generating TypeScript definitions from rust code.
Documentation
#![allow(dead_code)]

use std::collections::HashMap;

use indoc::indoc;
use pretty_assertions::assert_eq;
use tsify::Tsify;

#[test]
fn test_unit() {
    #[derive(Tsify)]
    struct Unit;

    if cfg!(feature = "js") {
        assert_eq!(Unit::DECL, "export type Unit = undefined;");
    } else {
        assert_eq!(Unit::DECL, "export type Unit = null;");
    };
}

#[test]
fn test_named_fields() {
    #[derive(Tsify)]
    struct A {
        a: (usize, u64),
        b: HashMap<String, i128>,
    }

    let expected = if cfg!(feature = "js") {
        indoc! {"
            export interface A {
                a: [number, number];
                b: Map<string, bigint>;
            }"
        }
    } else {
        indoc! {"
            export interface A {
                a: [number, number];
                b: Record<string, number>;
            }"
        }
    };

    assert_eq!(A::DECL, expected);
}

#[test]
fn test_newtype_struct() {
    #[derive(Tsify)]
    struct Newtype(i32);

    assert_eq!(Newtype::DECL, "export type Newtype = number;");
}

#[test]
fn test_tuple_struct() {
    #[derive(Tsify)]
    struct Tuple(i32, String);
    #[derive(Tsify)]
    struct EmptyTuple();

    assert_eq!(Tuple::DECL, "export type Tuple = [number, string];");
    assert_eq!(EmptyTuple::DECL, "export type EmptyTuple = [];");
}

#[test]
fn test_nested_struct() {
    #[derive(Tsify)]
    struct A {
        x: f64,
    }

    #[derive(Tsify)]
    struct B {
        a: A,
    }

    assert_eq!(
        B::DECL,
        indoc! {"
            export interface B {
                a: A;
            }"
        }
    );
}

#[test]
fn test_struct_with_borrowed_fields() {
    use std::borrow::Cow;

    #[derive(Tsify)]
    struct Borrow<'a> {
        raw: &'a str,
        cow: Cow<'a, str>,
    }

    assert_eq!(
        Borrow::DECL,
        indoc! {"
            export interface Borrow {
                raw: string;
                cow: string;
            }"
        }
    );
}

#[test]
fn test_tagged_struct() {
    #[derive(Tsify)]
    #[serde(tag = "type")]
    struct TaggedStruct {
        x: i32,
        y: i32,
    }

    assert_eq!(
        TaggedStruct::DECL,
        indoc! {r#"
            export interface TaggedStruct {
                type: "TaggedStruct";
                x: number;
                y: number;
            }"#
        }
    );
}