1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// This is some **MAGICAL** code that i wrote that i will probably never be able
// to understand again. But these are rust macros i guess...

#[macro_export]
// Macro to easily define an i18n resource.
macro_rules! r {
    (|($($args:pat),*)| $lit:literal) => {
        Some(I18NDynamicResource::new(|($($args),*)| format!($lit)))
    };

    (|$args:ident| $lit:literal) => {
        r!(|($args)| $lit);
    };

    (|($($args:pat),*)| { $lit:literal }) => {
       r!(|($($args),*)| $lit);
    };

    (|$args:ident| { $lit:literal }) => {
        r!(|($args)| $lit);
    };

    ($lit:literal) => {
        Some(format!($lit))
    };
}

#[macro_export]
macro_rules! define_i18n {
    ($base_i18n:ident, $($body:tt)*) => {
        deep_struct_update::update! { $($body)* ..$base_i18n::fallback() }
    };
}

#[macro_export]
macro_rules! t_prefix {
    ($dollar:tt, $name:ident, $prefix_var:ident $(. $prefix_access:tt)*) => (
        macro_rules! $name {
            ($dollar($access:tt).*) => (
                $prefix_var.access(|v| &v$(. $prefix_access)* $dollar(. $access)*)
            )
        }
    );

    ($dollar:tt, $prefix_var:ident $(.$prefix_access:tt)*) => (
        t_prefix!($dollar, t, $prefix_var $(. $prefix_access)*)
    );
}

#[macro_export]
macro_rules! t {
    ($var:ident.$($access:tt).*) => {
        $var.access(|v| &v.$($access).*)
    };
}