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
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
/* ------------------------------------------------------------
    PrettyGrammar
    Project.Github: "https://github.com/kerryeon/pretty-grammar"
---------------------------------------------------------------
    Author:
        Name: "kerryeon"
        Email: "besqer996@gnu.ac.kr"
        Github: "https://github.com/kerryeon"
    Generated:
        Date: "3/6/2019"
------------------------------------------------------------ */

/// Correct the string to match the grammar.
///
/// # Examples
///
/// ```
/// use pretty_grammar::*;
///
/// let result = translate("kr", "철수<은> 영희<를> 좋아합니다.".to_owned());
/// assert_eq!("철수는 영희를 좋아합니다.", result);
/// ```
///
/// # Panics
/// You should not use unsupported `lang`s.
///
pub fn translate(lang: &'static str, msg: String) -> String {
    for (target, func) in super::FILTER.iter() {
        if *target == lang {
            return func(msg)
        }
    }
    // Not Found
    panic!()
}

/// Correct `dynamic` string to match the grammar.
///
/// # Examples
///
/// ```
/// use pretty_grammar::*;
///
/// let name = "철수";
/// let obj = "영희";
/// let format = "{name}<은> {obj}<를> 좋아합니다.";
/// let result = translate!(format with
///     lang: "kr",
///     name: name,
///     obj: obj,
/// );
/// assert_eq!("철수는 영희를 좋아합니다.", result);
/// ```
///
/// # Panics
/// You should not use unsupported `lang`s.
///
#[macro_export]
macro_rules! translate {
    ($msg: tt with lang: $lang: tt, $($tag: ident: $arg: tt),* ) => ({
        $crate::translate(
            $lang, format_dyn!($msg with $($tag: $arg),*)
        )
    });
    // For unnecessary comma
    ($msg: tt with lang: $lang: tt, $($tag: ident: $arg: tt),*, ) => ({
        translate!($msg with lang: $lang, $($tag: $arg),*)
    });
}

/// Creates a `String` using dynamic `format` and interpolation of runtime expressions.
///
/// # Examples
///
/// ```
/// use pretty_grammar::*;
///
/// let name = "철수";
/// let obj = "영희";
/// let format = "{name}는 {obj}를 좋아합니다.";
/// let result = format_dyn!(format with
///     name: name,
///     obj: obj,
/// );
/// assert_eq!("철수는 영희를 좋아합니다.", result);
/// ```
///
#[macro_export]
macro_rules! format_dyn {
    // [Example]
    // {msg} with name: {name}, age: {age}
    ($msg: tt with $($tag: ident: $arg: tt),* ) => ({
        let mut msg: String = $msg.to_owned();
        $(
            msg = msg.replace(format!("{{{}}}", stringify!($tag)).as_str(), $arg);
        )*
        msg
    });
    // For unnecessary comma
    ($msg: tt with $($tag: ident: $arg: tt),*, ) => ({
        format_dyn!($msg with $($tag: $arg),*)
    });
}