use crate::e2e::escape::go_string_literal;
use heck::ToUpperCamelCase;
pub(super) struct GoMethodCallInfo {
pub(super) call_expr: String,
pub(super) is_pointer: bool,
pub(super) value_cast: Option<&'static str>,
}
pub(super) fn build_go_method_call(
result_var: &str,
method_name: &str,
args: Option<&serde_json::Value>,
import_alias: &str,
) -> GoMethodCallInfo {
match method_name {
"root_node_type" => GoMethodCallInfo {
call_expr: format!("{import_alias}.RootNodeInfo({result_var}).Kind"),
is_pointer: false,
value_cast: None,
},
"named_children_count" => GoMethodCallInfo {
call_expr: format!("{import_alias}.RootNodeInfo({result_var}).NamedChildCount"),
is_pointer: false,
value_cast: Some("uint"),
},
"has_error_nodes" => GoMethodCallInfo {
call_expr: format!("{import_alias}.TreeHasErrorNodes({result_var})"),
is_pointer: true,
value_cast: None,
},
"error_count" | "tree_error_count" => GoMethodCallInfo {
call_expr: format!("{import_alias}.TreeErrorCount({result_var})"),
is_pointer: true,
value_cast: Some("uint"),
},
"tree_to_sexp" => GoMethodCallInfo {
call_expr: format!("{import_alias}.TreeToSexp({result_var})"),
is_pointer: true,
value_cast: None,
},
"contains_node_type" => {
let node_type = args
.and_then(|a| a.get("node_type"))
.and_then(|v| v.as_str())
.unwrap_or("");
GoMethodCallInfo {
call_expr: format!("{import_alias}.TreeContainsNodeType({result_var}, \"{node_type}\")"),
is_pointer: true,
value_cast: None,
}
}
"find_nodes_by_type" => {
let node_type = args
.and_then(|a| a.get("node_type"))
.and_then(|v| v.as_str())
.unwrap_or("");
GoMethodCallInfo {
call_expr: format!("{import_alias}.FindNodesByType({result_var}, \"{node_type}\")"),
is_pointer: true,
value_cast: None,
}
}
"run_query" => {
let query_source = args
.and_then(|a| a.get("query_source"))
.and_then(|v| v.as_str())
.unwrap_or("");
let language = args
.and_then(|a| a.get("language"))
.and_then(|v| v.as_str())
.unwrap_or("");
let query_lit = go_string_literal(query_source);
let lang_lit = go_string_literal(language);
GoMethodCallInfo {
call_expr: format!("{import_alias}.RunQuery({result_var}, {lang_lit}, {query_lit}, []byte(source))"),
is_pointer: false,
value_cast: None,
}
}
other => {
let method_pascal = other.to_upper_camel_case();
GoMethodCallInfo {
call_expr: format!("{result_var}.{method_pascal}()"),
is_pointer: false,
value_cast: None,
}
}
}
}