From a16243cb511ccd3210bf2d42fc0c3a98293d4e21 Mon Sep 17 00:00:00 2001 From: Mia Date: Mon, 20 Jan 2025 21:20:24 +0000 Subject: [PATCH] lexgen lexicon types --- parakeet-lexgen/src/main.rs | 2 + parakeet-lexgen/src/types.rs | 225 +++++++++++++++++++++++++++++++++++ 2 files changed, 227 insertions(+) create mode 100644 parakeet-lexgen/src/types.rs diff --git a/parakeet-lexgen/src/main.rs b/parakeet-lexgen/src/main.rs index 4e74456d..9332860f 100644 --- a/parakeet-lexgen/src/main.rs +++ b/parakeet-lexgen/src/main.rs @@ -1,6 +1,8 @@ use clap::Parser; use walkdir::WalkDir; +mod types; + #[derive(Debug, Parser)] struct Cli { sources: Vec, diff --git a/parakeet-lexgen/src/types.rs b/parakeet-lexgen/src/types.rs new file mode 100644 index 00000000..255906fd --- /dev/null +++ b/parakeet-lexgen/src/types.rs @@ -0,0 +1,225 @@ +use serde::Deserialize; +use std::collections::BTreeMap; + +#[derive(Debug, Deserialize)] +pub struct Lexicon { + /// Lexicon language version + pub lexicon: i32, + // Lexicon NSID + pub id: String, + pub revision: Option, + pub description: Option, + pub defs: BTreeMap, +} + +#[derive(Debug, Deserialize)] +#[serde(tag = "type")] +#[serde(rename_all = "lowercase")] +pub enum LexiconDef { + Query(LexiconQuery), + Procedure(LexiconProcedure), + Subscription(LexiconSubscription), + Record(LexiconRecord), + String(LexiconString), + Array(LexiconArray), + Object(LexiconObject), + Token { description: Option }, +} + +#[derive(Debug, Deserialize)] +#[serde(tag = "type")] +#[serde(rename_all = "kebab-case")] +pub enum LexiconSchema { + Null { + description: Option, + }, + Boolean { + description: Option, + default: Option, + #[serde(rename = "const")] + constant: Option, + }, + Integer(LexiconInteger), + String(LexiconString), + Bytes { + description: Option, + #[serde(rename = "maxLength")] + max_length: Option, + #[serde(rename = "minLength")] + min_length: Option, + }, + CidLink { + description: Option, + }, + Array(LexiconArray), + Object(LexiconObject), + Blob { + description: Option, + accept: Option>, + #[serde(rename = "maxSize")] + max_size: Option, + }, + Ref { + description: Option, + #[serde(rename = "ref")] + ref_to: String, + }, + Union(LexiconUnion), + Unknown { + description: Option, + }, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "lowercase")] +pub enum RKey { + Tid, + Nsid, + Any, +} + +#[derive(Debug, Deserialize)] +#[serde(untagged)] +pub enum RecordKey { + Typed(RKey), + Other(String), +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum StringFormats { + AtIdentifier, + AtUri, + Cid, + Datetime, + Did, + Handle, + Nsid, + Tid, + RecordKey, + Uri, + Language, +} + +#[derive(Debug, Deserialize)] +pub struct HttpApiExchange { + pub description: Option, + pub encoding: String, + pub schema: Option, +} + +#[derive(Debug, Deserialize)] +pub struct LexiconError { + pub name: String, + pub description: Option, +} + +#[derive(Debug, Deserialize)] +pub struct LexiconSubMessage { + pub description: Option, + pub schema: Option, +} + +#[derive(Debug, Deserialize)] +pub struct LexiconRecord { + pub description: Option, + pub key: RecordKey, + pub record: LexiconObject, +} + +#[derive(Debug, Deserialize)] +pub struct LexiconQuery { + pub description: Option, + pub parameters: Option, + pub output: Option, + pub errors: Option>, +} + +#[derive(Debug, Deserialize)] +pub struct LexiconProcedure { + pub description: Option, + pub parameters: Option, + pub output: Option, + pub input: Option, + pub errors: Option>, +} + +#[derive(Debug, Deserialize)] +pub struct LexiconSubscription { + pub description: Option, + pub parameters: Option, + pub message: BTreeMap, + pub errors: Option>, +} + +#[derive(Debug, Deserialize)] +pub struct LexiconInteger { + pub description: Option, + + pub minimum: Option, + pub maximum: Option, + #[serde(rename = "enum")] + pub values: Option>, + pub default: Option, + #[serde(rename = "const")] + pub constant: Option, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct LexiconString { + pub description: Option, + + pub format: Option, + + pub max_length: Option, + pub min_length: Option, + pub max_graphemes: Option, + pub min_graphemes: Option, + + pub known_values: Option>, + #[serde(rename = "enum")] + pub values: Option>, + + pub default: Option, + #[serde(rename = "const")] + pub constant: Option, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct LexiconArray { + pub description: Option, + + pub min_length: Option, + pub max_length: Option, + pub items: Box, +} + +#[derive(Debug, Deserialize)] +#[serde(tag = "type")] +#[serde(rename = "object")] +pub struct LexiconObject { + pub description: Option, + pub properties: BTreeMap, + pub required: Option>, + pub nullable: Option>, +} + +#[derive(Debug, Deserialize)] +#[serde(tag = "type")] +#[serde(rename = "params")] +pub struct LexiconParams { + pub description: Option, + pub properties: BTreeMap, +} + +#[derive(Debug, Deserialize)] +#[serde(tag = "type")] +#[serde(rename = "union")] +pub struct LexiconUnion { + pub description: Option, + pub refs: Vec, + #[serde(default)] + pub closed: bool, +} -- 2.51.2