use elasticsearch::auth::Credentials;
use elasticsearch::http::transport::Transport;
use elasticsearch::Elasticsearch;
use handlebars::Handlebars;
use crate::commons::json_value_to_generic2;
use crate::core::elasticsearch::EsClient;
use crate::core::http_clients::HttpClient;
const RESOURCE_FOLDER_DSL: &str = "./resources/es_dsl";
const RESOURCE_FOLDER_MAPPINGS: &str = "./resources/es_mappings";
use crate::core::error2::Error;
use crate::core::error2::Result;
pub async fn create_single_node(
settings: &crate::core::elasticsearch::ElasticsearchSettings,
) -> Result<EsClient> {
let server = settings.server.clone().unwrap();
match Transport::single_node(&server) {
Ok(transport) => {
let h = handlebars(&String::from(RESOURCE_FOLDER_DSL));
log::info!("Elasticsearch_initialize_completed: server={}", server);
let es_client = EsClient {
server: server.to_string(),
client: Elasticsearch::new(transport),
handlebars: h,
request: HttpClient::build(5),
};
es_client.build_mappings(RESOURCE_FOLDER_MAPPINGS).await;
Ok(es_client)
}
Err(e) => {
log::error!(
"Elasticsearch_initialize_failed: server={}, error={:?}",
server,
e
);
Err(Error::UnexpectedError(anyhow::anyhow!(e)))
}
}
}
pub async fn create_cluster() -> Result<EsClient> {
let server = "http://localhost:9200";
let user = "";
let pass = "";
let credentials = Credentials::Basic(user.to_string(), pass.to_string());
match Transport::cloud(server, credentials) {
Ok(transport) => {
let h = handlebars(&String::from(RESOURCE_FOLDER_DSL));
log::info!("Elasticsearch_initialize_successful: server={}", server);
let es_client = EsClient {
server: server.to_string(),
client: Elasticsearch::new(transport),
handlebars: h,
request: HttpClient::build(5),
};
es_client.build_mappings(RESOURCE_FOLDER_MAPPINGS).await;
Ok(es_client)
}
Err(e) => {
log::error!(
"Elasticsearch_initialize_failed: server={}, error={:?}",
server,
e
);
Err(Error::UnexpectedError(anyhow::anyhow!(e)))
}
}
}
pub fn handlebars(_dsl_template_location: &str) -> Handlebars<'static> {
let _dsl_template_location =
std::path::PathBuf::from(crate::commons::service_home()).join(_dsl_template_location);
let mut handlebars = Handlebars::new();
handlebars.set_strict_mode(false);
if _dsl_template_location.exists() {
let dsl_files = crate::commons::list_files(_dsl_template_location, "yaml").unwrap();
for file in dsl_files {
let _m2: serde_json::Map<String, serde_json::Value> = match serde_any::from_file(&file)
{
Ok(map) => {
for (key, value) in &map {
let source = json_value_to_generic2::<String>(value).unwrap();
#[allow(clippy::useless_format)]
let _key = format!("{}", key);
handlebars.register_template_string(&_key, source).unwrap();
}
map
}
Err(e) => {
log::info!(
"Elasticsearch-Read-YAML-Error: path={}, error={:?}",
&file.to_str().unwrap(),
e
);
serde_json::Map::new()
}
};
}
} else {
log::warn!(
"Elasticsearch-dsl-folder-not-exists: path={}",
_dsl_template_location.to_str().unwrap()
)
}
handlebars.set_strict_mode(true);
handlebars
}