idiolect-records 0.6.0

Rust record types mirroring the dev.idiolect.* Lexicon family.
Documentation
// @generated by idiolect-codegen. do not edit.
// source: dev.idiolect.adapter

//! A subprocess or HTTP-endpoint wrapper for a framework's tooling, authored by incentive-aligned parties. Adapters are how idiolect glues existing frameworks (Hasura, Prisma, Datomic, FHIR, Coq, Meilisearch, ...) without forking them.

#![allow(
    missing_docs,
    clippy::doc_markdown,
    clippy::struct_excessive_bools,
    clippy::derive_partial_eq_without_eq
)]
use serde::{Deserialize, Serialize};

/// Declaration that a specific tool version can be invoked via a specific protocol under named isolation requirements. Orchestrators and observers use adapters to run third-party tools in a known, reproducible way.
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Adapter {
    /// DID of the adapter author. Not an endorsement; users judge.
    pub author: idiolect_records::Did,
    /// Canonical framework name, e.g. 'hasura', 'prisma', 'datomic', 'fhir-validator', 'coq', 'meilisearch'.
    pub framework: String,
    /// How the adapter is invoked.
    pub invocation_protocol: AdapterInvocationProtocol,
    /// Sandboxing requirements the orchestrator must honour.
    pub isolation: AdapterIsolation,
    pub occurred_at: idiolect_records::Datetime,
    /// Optional verification record demonstrating the adapter's conformance.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub verification: Option<idiolect_records::AtUri>,
    /// Semver range the adapter supports.
    pub version_range: String,
}

impl crate::Record for Adapter {
    const NSID: &'static str = "dev.idiolect.adapter";
}

/// How the adapter is invoked.
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AdapterInvocationProtocol {
    /// Binary name (subprocess), URL (http), or wasm module reference.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub entry_point: Option<String>,
    /// Schema of the adapter's input.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub input_schema: Option<crate::generated::dev::idiolect::defs::SchemaRef>,
    /// Transport protocol.
    pub kind: AdapterInvocationProtocolKind,
    /// Schema of the adapter's output.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub output_schema: Option<crate::generated::dev::idiolect::defs::SchemaRef>,
}
/// AdapterInvocationProtocolKind.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum AdapterInvocationProtocolKind {
    Subprocess,
    Http,
    Wasm,
}

/// Sandboxing requirements the orchestrator must honour.
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AdapterIsolation {
    /// What filesystem access the adapter is allowed.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub filesystem_policy: Option<AdapterIsolationFilesystemPolicy>,
    pub kind: AdapterIsolationKind,
    /// What network access the adapter is allowed.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub network_policy: Option<AdapterIsolationNetworkPolicy>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub resource_limits: Option<AdapterIsolationResourceLimits>,
}
/// AdapterIsolationFilesystemPolicy.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum AdapterIsolationFilesystemPolicy {
    Readonly,
    Scratch,
    WritableSubtree,
    Full,
}
/// AdapterIsolationKind.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum AdapterIsolationKind {
    None,
    Process,
    Container,
    Vm,
    WasmSandbox,
}
/// AdapterIsolationNetworkPolicy.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum AdapterIsolationNetworkPolicy {
    None,
    EgressDenylist,
    EgressAllowlist,
    Full,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AdapterIsolationResourceLimits {
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub max_cpu_seconds: Option<i64>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub max_memory_bytes: Option<i64>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub max_wall_seconds: Option<i64>,
}