#![allow(non_snake_case, non_camel_case_types, non_upper_case_globals)]
use crate::ported::errors;
use crate::ported::version;
use serde::Serialize;
use serde_json::Value;
use std::collections::BTreeMap;
use std::io::{self, Write};
pub type Params = BTreeMap<&'static str, String>;
#[derive(Serialize, Debug)]
pub struct okResponse {
#[serde(rename = "status")]
pub Status: &'static str, #[serde(rename = "version")]
pub Version: u64, #[serde(rename = "data")]
pub Data: Value, }
#[derive(Serialize, Debug)]
pub struct errorResponse {
#[serde(rename = "status")]
pub Status: &'static str, #[serde(rename = "code")]
pub Code: i32, #[serde(rename = "version")]
pub Version: u64, #[serde(rename = "params")]
pub Params: Option<Params>, }
#[derive(Serialize, Debug, Default)]
pub struct ConfigureResponse {
#[serde(rename = "defaultStore")]
pub DefaultStore: DefaultStoreField, #[serde(rename = "storeSettings")]
pub StoreSettings: BTreeMap<String, String>, }
#[derive(Serialize, Debug, Default)]
pub struct DefaultStoreField {
#[serde(rename = "path")]
pub Path: String, #[serde(rename = "settings")]
pub Settings: String, }
pub fn MakeConfigureResponse() -> ConfigureResponse {
ConfigureResponse {
DefaultStore: DefaultStoreField::default(),
StoreSettings: BTreeMap::new(), }
}
#[derive(Serialize, Debug, Default)]
pub struct ListResponse {
#[serde(rename = "files")]
pub Files: BTreeMap<String, Vec<String>>, }
pub fn MakeListResponse() -> ListResponse {
ListResponse {
Files: BTreeMap::new(), }
}
#[derive(Serialize, Debug, Default)]
pub struct TreeResponse {
#[serde(rename = "directories")]
pub Directories: BTreeMap<String, Vec<String>>, }
pub fn MakeTreeResponse() -> TreeResponse {
TreeResponse {
Directories: BTreeMap::new(), }
}
#[derive(Serialize, Debug, Default)]
pub struct FetchResponse {
#[serde(rename = "contents")]
pub Contents: String, }
pub fn MakeFetchResponse() -> FetchResponse {
FetchResponse::default() }
#[derive(Serialize, Debug, Default)]
pub struct SaveResponse {}
pub fn MakeSaveResponse() -> SaveResponse {
SaveResponse::default() }
#[derive(Serialize, Debug, Default)]
pub struct DeleteResponse {}
pub fn MakeDeleteResponse() -> DeleteResponse {
DeleteResponse::default() }
pub fn SendOk<T: Serialize>(data: T) {
let data_value = serde_json::to_value(&data).unwrap_or(Value::Null);
let envelope = serde_json::to_value(&okResponse {
Status: "ok", Version: version::CODE, Data: data_value, })
.unwrap();
let est = serde_json::to_vec(&envelope).map(|v| v.len()).unwrap_or(0);
crate::diag::log(&format!("SEND status=ok bytes={est}"));
SendRaw_value(&envelope);
}
pub fn SendErrorAndExit(error_code: errors::Code, params: Option<Params>) -> ! {
let envelope = serde_json::to_value(&errorResponse {
Status: "error", Code: error_code.as_i32(), Version: version::CODE, Params: params, })
.unwrap();
let summary = serde_json::to_string(&envelope).unwrap_or_default();
let summary = if summary.len() > 300 {
format!("{}…", &summary[..300])
} else {
summary
};
crate::diag::log(&format!(
"SEND status=error code={} envelope={}",
error_code.as_i32(),
summary
));
SendRaw_value(&envelope);
crate::diag::log(&format!(
"EXIT code={} reason=send_error",
error_code.as_i32()
));
errors::exit_with_code(error_code); unreachable!()
}
pub fn SendRaw<T: Serialize>(response: &T) {
SendRaw_value(&serde_json::to_value(response).unwrap_or(Value::Null));
}
fn SendRaw_value(value: &Value) {
let mut bytes_buffer: Vec<u8> = Vec::new(); if let Err(e) = serde_json::to_writer(&mut bytes_buffer, value) {
eprintln!("Unable to encode response for sending: {e}"); std::process::exit(1);
}
let mut stdout = io::stdout().lock(); let len = bytes_buffer.len() as u32;
if let Err(e) = stdout.write_all(&len.to_le_bytes()) {
eprintln!("Unable to send the length of the response: {e}"); std::process::exit(1);
}
if let Err(e) = stdout.write_all(&bytes_buffer) {
eprintln!("Unable to send the response: {e}"); std::process::exit(1);
}
let _ = stdout.flush();
}
pub fn params_of(pairs: &[(&'static str, &str)]) -> Params {
let mut p = Params::new();
for (k, v) in pairs {
p.insert(*k, v.to_string());
}
p
}
#[allow(non_snake_case)]
#[allow(non_camel_case_types)]
const _: () = ();