zod-core 0.1.0

Rust integraions with the `zod` typescript library.
Documentation
#![deny(unsafe_code)]

pub mod codegen;
pub mod error;
pub mod server;

pub type ResponseSender = futures::channel::mpsc::UnboundedSender<Response>;

#[derive(serde::Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
pub enum Request {
    Exec {
        id: usize,
        #[serde(flatten)]
        value: serde_json::Value,
    },
    CancelStream {
        id: usize,
    },
}

#[derive(serde::Serialize, Debug)]
#[serde(rename_all = "camelCase")]
pub enum Response {
    Method {
        id: usize,
        data: serde_json::Value,
    },
    Stream {
        id: usize,
        data: serde_json::Value,
    },
    Error {
        id: Option<usize>,
        data: error::Error,
    },
}

impl Response {
    pub fn error(id: impl Into<Option<usize>>, err: impl Into<error::Error>) -> Self {
        Self::Error {
            id: id.into(),
            data: err.into(),
        }
    }

    pub fn method(id: usize, value: impl serde::ser::Serialize) -> Self {
        match serde_json::to_value(value) {
            Ok(data) => Self::Method { id, data },
            Err(data) => Self::error(id, data),
        }
    }

    pub fn stream(id: usize, value: impl serde::ser::Serialize) -> Self {
        match serde_json::to_value(value) {
            Ok(data) => Self::Stream { id, data },
            Err(value) => Self::error(id, value),
        }
    }
}