#![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 _: () = ();