pub fn lit_to_str(lit: &syn::Lit) -> String {
    match lit {
        syn::Lit::Bool(s) => s.value.to_string(),
        syn::Lit::Str(s) => string_to_identifier(&s.value()),
        syn::Lit::Int(s) => number_to_identifier(s.base10_digits()),
        syn::Lit::Float(s) => number_to_identifier(s.base10_digits()),
        _ => unimplemented!("String conversion for literal. Only bool, str, positive int, and float values are supported."),
    }
}

fn number_to_identifier(num: &str) -> String {
    num.chars()
        .map(|x| match x {
            '.' => 'd',
            '0'..='9' => x,
            _ => panic!("This is not a valid number. Contains unknown sign {}", x),
        })
        .collect()
}

fn string_to_identifier(num: &str) -> String {
    num.chars()
        .map(|x| match x {
            '0'..='9' => x.to_string(),
            'a'..='z' => x.to_string(),
            'A'..='Z' => x.to_string(),
            '!' => "_exclamation".to_string(),
            '"' => "_double_quote".to_string(),
            '#' => "_hash".to_string(),
            '$' => "_dollar".to_string(),
            '%' => "_percent".to_string(),
            '&' => "_ampercand".to_string(),
            '\'' => "_quote".to_string(),
            '(' => "_left_paranthesis".to_string(),
            ')' => "_right_paranthesis".to_string(),
            '*' => "_asterisk".to_string(),
            '+' => "_plus".to_string(),
            ',' => "_comma".to_string(),
            '-' => "_minus".to_string(),
            '.' => "_full_stop".to_string(),
            '/' => "_slash".to_string(),
            ':' => "_colon".to_string(),
            ';' => "_semicolon".to_string(),
            '<' => "_less_than".to_string(),
            '=' => "_equal".to_string(),
            '>' => "_greater_than".to_string(),
            '?' => "_questionmark".to_string(),
            '@' => "_at".to_string(),
            '[' => "_left_bracket".to_string(),
            '\\' => "_back_slash".to_string(),
            ']' => "_right_bracket".to_string(),
            '^' => "_caret".to_string(),
            '`' => "_backtick".to_string(),
            '{' => "_left_brace".to_string(),
            '|' => "_vertical_bar".to_string(),
            '}' => "_right_brace".to_string(),
            '~' => "_tilde".to_string(),
            _ => '_'.to_string(),
        })
        .collect()
}
