#![allow(non_snake_case, non_camel_case_types, non_upper_case_globals)]
use crate::ported::errors;
use crate::ported::request::configure;
use crate::ported::request::delete as delete_mod;
use crate::ported::request::fetch;
use crate::ported::request::list;
use crate::ported::request::save;
use crate::ported::request::tree;
use crate::ported::response;
use serde::Deserialize;
use serde_json::Value;
use std::collections::BTreeMap;
use std::io::{self, Read};
#[derive(Deserialize, Debug, Default, Clone)]
#[serde(default)]
pub struct StoreSettings { #[serde(rename = "gpgPath")]
pub GpgPath: String, }
#[derive(Deserialize, Debug, Default, Clone)]
#[serde(default)]
pub struct store { #[serde(rename = "id")]
pub ID: String, #[serde(rename = "name")]
pub Name: String, #[serde(rename = "path")]
pub Path: String, #[serde(rename = "settings")]
#[serde(default)]
pub Settings: StoreSettings, }
#[derive(Deserialize, Debug, Default, Clone)]
#[serde(default)]
pub struct settings { #[serde(rename = "gpgPath")]
pub GpgPath: String, #[serde(rename = "stores")]
pub Stores: BTreeMap<String, store>, }
#[derive(Deserialize, Debug, Default)]
#[serde(default)]
pub struct request { #[serde(rename = "action")]
pub Action: String, #[serde(rename = "settings")]
pub Settings: settings, #[serde(rename = "file")]
pub File: String, #[serde(rename = "contents")]
pub Contents: String, #[serde(rename = "storeId")]
pub StoreID: String, #[serde(rename = "echoResponse")]
pub EchoResponse: Option<Value>, }
pub fn Process() {
let requestLength = match parseRequestLength(io::stdin().lock()) { Ok(n) => n,
Err(e) => { eprintln!("Unable to parse the length of the browser request: {e}"); response::SendErrorAndExit( errors::Code::ParseRequestLength,
Some(response::params_of(&[
(errors::field::MESSAGE, "Unable to parse the length of the browser request"),
(errors::field::ERROR, &e.to_string()),
])),
);
}
};
let request = match parseRequest(requestLength, io::stdin().lock()) { Ok(r) => r,
Err(e) => { eprintln!("Unable to parse the browser request: {e}"); response::SendErrorAndExit( errors::Code::ParseRequest,
Some(response::params_of(&[
(errors::field::MESSAGE, "Unable to parse the browser request"),
(errors::field::ERROR, &e.to_string()),
])),
);
}
};
let req = &request;
match req.Action.as_str() { "configure" => configure::configure(req), "list" => list::listFiles(req), "tree" => tree::listDirectories(req), "fetch" => fetch::fetchDecryptedContents(req), "save" => save::saveEncryptedContents(req), "delete" => delete_mod::deleteFile(req), "echo" => { response::SendRaw(&req.EchoResponse.clone().unwrap_or(Value::Null)); }
other => { eprintln!("Received a browser request with an unknown action: {other}"); response::SendErrorAndExit( errors::Code::InvalidRequestAction,
Some(response::params_of(&[
(errors::field::MESSAGE, "Invalid request action"),
(errors::field::ACTION, other),
])),
);
}
}
}
pub fn parseRequestLength<R: Read>(mut input: R) -> Result<u32, io::Error> {
let mut length = [0u8; 4]; input.read_exact(&mut length)?; Ok(u32::from_le_bytes(length)) }
pub fn parseRequest<R: Read>(messageLength: u32, input: R) -> Result<request, String> {
let reader = input.take(messageLength as u64); serde_json::from_reader(reader) .map_err(|e| format!("{e}"))
}
#[allow(non_snake_case)]
#[allow(non_camel_case_types)]
const _: () = ();