use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use thiserror::Error;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ParseResult {
pub tier: u8,
pub frontmatter: Option<Frontmatter>,
pub body: String,
pub variables: Vec<String>,
pub warnings: Vec<ParseWarning>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct Frontmatter {
pub id: Option<String>,
pub version: Option<String>,
pub description: Option<String>,
pub model: Option<ModelHints>,
pub input: Option<InputSpec>,
pub output: Option<OutputSpec>,
pub evals: Option<Vec<Eval>>,
pub intentry: Option<IntrEntryMeta>,
#[serde(flatten)]
pub extra: HashMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ModelHints {
pub preferred: Option<Vec<String>>,
pub temperature: Option<f64>,
pub max_tokens: Option<u32>,
pub top_p: Option<f64>,
pub stop: Option<Vec<String>>,
#[serde(flatten)]
pub extra: HashMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct InputSpec {
pub schema: Option<Picoschema>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct OutputSpec {
pub schema: Option<Picoschema>,
pub format: Option<String>,
}
pub type Picoschema = serde_json::Value;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Eval {
pub description: Option<String>,
pub input: serde_json::Value,
pub expect: Option<EvalExpectation>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EvalExpectation {
pub contains: Option<String>,
pub not_contains: Option<String>,
pub equals: Option<String>,
pub json_schema: Option<serde_json::Value>,
#[serde(flatten)]
pub extra: HashMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct IntrEntryMeta {
pub tags: Option<Vec<String>>,
pub license: Option<String>,
pub parent: Option<String>,
pub forked_at: Option<String>,
#[serde(flatten)]
pub extra: HashMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ParseWarning {
pub code: String,
pub message: String,
}
#[derive(Debug, Clone, Error, PartialEq)]
pub enum ParseError {
#[error("file is not valid UTF-8: {0}")]
InvalidUtf8(String),
#[error("invalid YAML frontmatter: {0}")]
InvalidFrontmatter(String),
#[error("invalid field '{field}': {reason}")]
InvalidField { field: String, reason: String },
#[error("file too large: {size} bytes (max 1 MB)")]
FileTooLarge { size: usize },
}