use serde::{Deserialize, Serialize};
use ts_rs::TS;
#[derive(Clone, Copy, Debug, Deserialize, Serialize, PartialEq, TS)]
#[serde(rename_all = "snake_case")]
pub enum HttpMethodType {
Get,
Post,
Head,
Options,
Patch,
Delete,
Put,
Trace,
Connect,
}
#[derive(Clone, Copy, Debug, Deserialize, Serialize, PartialEq, TS)]
#[serde(rename_all = "snake_case")]
pub enum Subsystem {
Metadata,
Http,
Jobs,
SqliteFunctions,
#[serde(other)]
Unknown,
}
#[derive(Clone, Copy, Debug, Deserialize, Serialize, PartialEq, TS)]
#[serde(rename_all = "snake_case")]
pub enum GuestRuntime {
Rust,
EcmaScript,
#[serde(other)]
Unknown,
}
#[derive(Clone, Debug, Deserialize, Serialize, TS)]
pub struct HttpRoute {
pub method: HttpMethodType,
pub path: String,
}
#[derive(Clone, Debug, Deserialize, Serialize, TS)]
pub struct Job {
pub name: String,
pub spec: String,
pub timeout: Option<u64>,
}
#[derive(Clone, Copy, Debug, Deserialize, Serialize, PartialEq, TS)]
pub enum SqliteFunctionFlag {
Utf8,
Utf16le,
Utf16be,
Utf16,
Deterministic,
DirectOnly,
Subtype,
Innocuous,
ResultSubtype,
Selforder1,
}
#[derive(Clone, Debug, Deserialize, Serialize, TS)]
pub struct SqliteScalarFunction {
pub name: String,
pub num_args: u32,
pub flags: Vec<SqliteFunctionFlag>,
}
#[derive(Clone, Debug, Deserialize, Serialize, TS)]
pub enum SqliteFunction {
Scalar(SqliteScalarFunction),
}
#[derive(Clone, Debug, Default, Deserialize, Serialize, TS)]
#[ts(optional_fields)]
pub struct Metadata {
pub display_name: Option<String>,
pub description: Option<String>,
pub icon: Option<String>,
pub guest_runtime: Option<GuestRuntime>,
pub version: Option<String>,
pub admin_ui_path: Option<String>,
}
impl std::fmt::Display for Metadata {
fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
return write!(
fmt,
"Metadata(display_name={}, rt={:?})",
self.display_name.as_deref().unwrap_or("??"),
self.guest_runtime.unwrap_or(GuestRuntime::Unknown),
);
}
}
#[derive(Clone, Debug, Default, Deserialize, Serialize, TS)]
#[ts(export)]
pub struct InitArguments {
pub version: Option<String>,
pub subsystems: Option<Vec<Subsystem>>,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize, TS)]
#[ts(export)]
pub struct InitManifest {
pub metadata: Option<Metadata>,
pub http_handlers: Option<Vec<HttpRoute>>,
pub job_handlers: Option<Vec<Job>>,
pub sqlite_functions: Option<Vec<SqliteFunction>>,
}