const_env_impl--value 0.1.2

Configure const and static items by environment variables.
Documentation
use const_env_impl::{from_env, TestEnv};

use proc_macro2::TokenStream;
use quote::quote;

#[test]
fn test_str() {
    let env = TestEnv::builder()
        .set("MYVAR", "world")
        .build();
    let attr: TokenStream = quote! {
        ("MYVAR")
    };
    let item: TokenStream = quote! {
        const MYVAR: &'static str = "Hello";
    };
    let expected: TokenStream = quote! {
        const MYVAR: &'static str = "world";
    };
    let result = from_env(attr, item, env);
    assert_eq!(format!("{}", expected), format!("{}", result));
}

#[test]
fn test_str_with_escapes() {
    let env = TestEnv::builder()
        .set("MYVAR", "world\\tfoo")
        .build();
    let attr: TokenStream = quote! {
        ("MYVAR")
    };
    let item: TokenStream = quote! {
        const MYVAR: &'static str = "Hello";
    };
    let expected: TokenStream = quote! {
        const MYVAR: &'static str = "world\tfoo";
    };
    let result = from_env(attr, item, env);
    assert_eq!(format!("{}", expected), format!("{}", result));
}

#[test]
fn test_byte_str() {
    let env = TestEnv::builder()
        .set("MYVAR", "world")
        .build();
    let attr: TokenStream = quote! {
        ("MYVAR")
    };
    let item: TokenStream = quote! {
        const MYVAR: &'static [u8] = b"Hello";
    };
    let expected: TokenStream = quote! {
        const MYVAR: &'static [u8] = b"world";
    };
    let result = from_env(attr, item, env);
    assert_eq!(format!("{}", expected), format!("{}", result));
}

#[test]
fn test_u32() {
    let env = TestEnv::builder()
        .set("MYVAR", "1")
        .build();
    let attr: TokenStream = quote! {
        ("MYVAR")
    };
    let item: TokenStream = quote! {
        const MYVAR: u32 = 0;
    };
    let expected: TokenStream = quote! {
        const MYVAR: u32 = 1;
    };
    let result = from_env(attr, item, env);
    assert_eq!(format!("{}", expected), format!("{}", result));
}

#[test]
fn test_u32_with_suffix() {
    let env = TestEnv::builder()
        .set("MYVAR", "1u32")
        .build();
    let attr: TokenStream = quote! {
        ("MYVAR")
    };
    let item: TokenStream = quote! {
        const MYVAR: u32 = 0;
    };
    let expected: TokenStream = quote! {
        const MYVAR: u32 = 1u32;
    };
    let result = from_env(attr, item, env);
    assert_eq!(format!("{}", expected), format!("{}", result));
}

#[test]
fn test_i64() {
    let env = TestEnv::builder()
        .set("MYVAR", "1")
        .build();
    let attr: TokenStream = quote! {
        ("MYVAR")
    };
    let item: TokenStream = quote! {
        const MYVAR: i64 = 0;
    };
    let expected: TokenStream = quote! {
        const MYVAR: i64 = 1;
    };
    let result = from_env(attr, item, env);
    assert_eq!(format!("{}", expected), format!("{}", result));
}

#[test]
fn test_i64_with_suffix() {
    let env = TestEnv::builder()
        .set("MYVAR", "1i64")
        .build();
    let attr: TokenStream = quote! {
        ("MYVAR")
    };
    let item: TokenStream = quote! {
        const MYVAR: i64 = 0;
    };
    let expected: TokenStream = quote! {
        const MYVAR: i64 = 1i64;
    };
    let result = from_env(attr, item, env);
    assert_eq!(format!("{}", expected), format!("{}", result));
}

#[test]
fn test_i64_with_negative() {
    let env = TestEnv::builder()
        .set("MYVAR", "-1")
        .build();
    let attr: TokenStream = quote! {
        ("MYVAR")
    };
    let item: TokenStream = quote! {
        const MYVAR: i64 = -0;
    };
    let expected: TokenStream = quote! {
        const MYVAR: i64 = -1;
    };
    let result = from_env(attr, item, env);
    assert_eq!(format!("{}", expected), format!("{}", result));
}

#[test]
fn test_char() {
    let env = TestEnv::builder()
        .set("MYVAR", "b")
        .build();
    let attr: TokenStream = quote! {
        ("MYVAR")
    };
    let item: TokenStream = quote! {
        const MYVAR: char = 'a';
    };
    let expected: TokenStream = quote! {
        const MYVAR: char = 'b';
    };
    let result = from_env(attr, item, env);
    assert_eq!(format!("{}", expected), format!("{}", result));
}

#[test]
fn test_byte() {
    let env = TestEnv::builder()
        .set("MYVAR", "b")
        .build();
    let attr: TokenStream = quote! {
        ("MYVAR")
    };
    let item: TokenStream = quote! {
        const MYVAR: u8 = b'a';
    };
    let expected: TokenStream = quote! {
        const MYVAR: u8 = b'b';
    };
    let result = from_env(attr, item, env);
    assert_eq!(format!("{}", expected), format!("{}", result));
}

#[test]
fn test_byte_with_escape() {
    let env = TestEnv::builder()
        .set("MYVAR", "\\n")
        .build();
    let attr: TokenStream = quote! {
        ("MYVAR")
    };
    let item: TokenStream = quote! {
        const MYVAR: u8 = b'\t';
    };
    let expected: TokenStream = quote! {
        const MYVAR: u8 = b'\n';
    };
    let result = from_env(attr, item, env);
    assert_eq!(format!("{}", expected), format!("{}", result));
}

#[test]
fn test_f32() {
    let env = TestEnv::builder()
        .set("MYVAR", "1.0")
        .build();
    let attr: TokenStream = quote! {
        ("MYVAR")
    };
    let item: TokenStream = quote! {
        const MYVAR: f32 = 0.0;
    };
    let expected: TokenStream = quote! {
        const MYVAR: f32 = 1.0;
    };
    let result = from_env(attr, item, env);
    assert_eq!(format!("{}", expected), format!("{}", result));
}

#[test]
fn test_f32_with_suffix() {
    let env = TestEnv::builder()
        .set("MYVAR", "1f32")
        .build();
    let attr: TokenStream = quote! {
        ("MYVAR")
    };
    let item: TokenStream = quote! {
        const MYVAR: f32 = 0.0;
    };
    let expected: TokenStream = quote! {
        const MYVAR: f32 = 1f32;
    };
    let result = from_env(attr, item, env);
    assert_eq!(format!("{}", expected), format!("{}", result));
}

#[test]
fn test_f32_with_negative() {
    let env = TestEnv::builder()
        .set("MYVAR", "-1.0")
        .build();
    let attr: TokenStream = quote! {
        ("MYVAR")
    };
    let item: TokenStream = quote! {
        const MYVAR: f32 = -0.0;
    };
    let expected: TokenStream = quote! {
        const MYVAR: f32 = -1.0;
    };
    let result = from_env(attr, item, env);
    assert_eq!(format!("{}", expected), format!("{}", result));
}

#[test]
fn test_bool() {
    let env = TestEnv::builder()
        .set("MYVAR", "true")
        .build();
    let attr: TokenStream = quote! {
        ("MYVAR")
    };
    let item: TokenStream = quote! {
        const MYVAR: bool = false;
    };
    let expected: TokenStream = quote! {
        const MYVAR: bool = true;
    };
    let result = from_env(attr, item, env);
    assert_eq!(format!("{}", expected), format!("{}", result));
}

#[test]
fn test_str_static() {
    let env = TestEnv::builder()
        .set("MYVAR", "world")
        .build();
    let attr: TokenStream = quote! {
        ("MYVAR")
    };
    let item: TokenStream = quote! {
        static MYVAR: &'static str = "Hello";
    };
    let expected: TokenStream = quote! {
        static MYVAR: &'static str = "world";
    };
    let result = from_env(attr, item, env);
    assert_eq!(format!("{}", expected), format!("{}", result));
}

#[test]
fn test_i16_negative() {
    let env = TestEnv::builder()
        .set("MYVAR", "-123")
        .build();
    let attr: TokenStream = quote! {
        ("MYVAR")
    };
    let item: TokenStream = quote! {
        static MYVAR: i16 = 0;
    };
    let expected: TokenStream = quote! {
        static MYVAR: i16 = -123;
    };
    let result = from_env(attr, item, env);
    assert_eq!(format!("{}", expected), format!("{}", result));
}

#[test]
fn test_f32_negative() {
    let env = TestEnv::builder()
        .set("MYVAR", "-123.0")
        .build();
    let attr: TokenStream = quote! {
        ("MYVAR")
    };
    let item: TokenStream = quote! {
        static MYVAR: f32 = 0.0;
    };
    let expected: TokenStream = quote! {
        static MYVAR: f32 = -123.0;
    };
    let result = from_env(attr, item, env);
    assert_eq!(format!("{}", expected), format!("{}", result));
}

#[test]
fn test_default_name() {
    let env = TestEnv::builder()
        .set("MYVAR", "world")
        .build();
    let attr: TokenStream = TokenStream::new();
    let item: TokenStream = quote! {
        static MYVAR: &'static str = "Hello";
    };
    let expected: TokenStream = quote! {
        static MYVAR: &'static str = "world";
    };
    let result = from_env(attr, item, env);
    assert_eq!(format!("{}", expected), format!("{}", result));
}

#[test]
fn test_i32_negative_whitespace() {
    let env = TestEnv::builder()
        .set("MYVAR", " - 123 ")
        .build();
    let attr: TokenStream = quote! {
        ("MYVAR")
    };
    let item: TokenStream = quote! {
        static MYVAR: i32 = 0;
    };
    let expected: TokenStream = quote! {
        static MYVAR: i32 = -123;
    };
    let result = from_env(attr, item, env);
    assert_eq!(format!("{}", expected), format!("{}", result));
}