use crate::{GenericSyntax, LanguageSyntax, to_camel_case};
pub struct JavaScriptSyntax;
impl LanguageSyntax for JavaScriptSyntax {
fn field_name(&self, name: &str) -> String {
to_camel_case(name)
}
fn path_expr(&self, base_var: &str, suffix: &str) -> String {
let var_name = to_camel_case(base_var);
format!("`${{{}}}{}`", var_name, suffix)
}
fn suffix_expr(&self, acc_var: &str, relative: &str) -> String {
let var_name = to_camel_case(acc_var);
if relative.is_empty() {
var_name
} else {
format!("_m({}, '{}')", var_name, relative)
}
}
fn prefix_expr(&self, prefix: &str, acc_var: &str) -> String {
let var_name = to_camel_case(acc_var);
if prefix.is_empty() {
var_name
} else {
let prefix_base = prefix.trim_end_matches('_');
format!("_p('{}', {})", prefix_base, var_name)
}
}
fn constructor(&self, type_name: &str, path_expr: &str) -> String {
format!("create{}(client, {})", type_name, path_expr)
}
fn field_init(&self, indent: &str, name: &str, _type_ann: &str, value: &str) -> String {
format!("{}{}: {},", indent, name, value)
}
fn generic_syntax(&self) -> GenericSyntax {
GenericSyntax::JAVASCRIPT
}
fn string_literal(&self, value: &str) -> String {
format!("'{}'", value)
}
fn constructor_name(&self, type_name: &str) -> String {
format!("create{}", type_name)
}
fn disc_arg_expr(&self, template: &str) -> String {
if template == "{disc}" {
"disc".to_string()
} else if template.is_empty() {
"''".to_string()
} else if !template.contains("{disc}") {
format!("'{}'", template)
} else if template.ends_with("{disc}") {
let static_part = template.trim_end_matches("{disc}").trim_end_matches('_');
format!("_m('{}', disc)", static_part)
} else {
let js_template = template.replace("{disc}", "${disc}");
format!("`{}`", js_template)
}
}
fn template_expr(&self, acc_var: &str, template: &str) -> String {
let var_name = to_camel_case(acc_var);
if template.is_empty() {
format!("_m({}, disc)", var_name)
} else if template == "{disc}" {
format!("_m({}, disc)", var_name)
} else if !template.contains("{disc}") {
format!("_m({}, '{}')", var_name, template)
} else {
if let Some(static_part) = template.strip_suffix("{disc}") {
if static_part.is_empty() {
format!("_m({}, disc)", var_name)
} else {
let static_part = static_part.trim_end_matches('_');
format!("_m(_m({}, '{}'), disc)", var_name, static_part)
}
} else {
let js_template = template.replace("{disc}", "${disc}");
format!("_m({}, `{}`)", var_name, js_template)
}
}
}
}