idiolect-records 0.7.0

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

//! A community-published opinionated path with structured applicability conditions and optional verification requirements. conditions/preconditions/caveats are structured ThCondition combinator trees and a typed caveat list; requiredVerifications is an array of LensProperty so consumers can check specific theorems, not just kinds. Narrative prose lives in `annotations` / `caveatsText`.

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

/// A community endorses a lens path under structured conditions. Consumers evaluate the condition tree against their invocation context to decide applicability; the caveats list gives structured failure modes to match on.
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Recommendation {
    /// Why this path, how to use it, known strengths. Narrative; not consumed by machine matchers.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub annotations: Option<String>,
    /// Structured grounding for the endorsement — a community policy, an external standard, a derived record. Omit when the recommendation is self-asserted by the issuing community.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub basis: Option<crate::generated::dev::idiolect::defs::Basis>,
    /// Structured known-failure-mode list. Consumers match on `mode` / `affects` / `severity` without substring search.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub caveats: Option<Vec<crate::generated::dev::idiolect::defs::Caveat>>,
    /// Narrative commentary on the caveats. Companion to the structured `caveats` list, not a replacement.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub caveats_text: Option<String>,
    /// Structured applicability predicate in postfix-operator form: each item is either an atomic predicate over the invocation context or a combinator (and/or/not) that pops operands from the running stack. An empty array means 'always applies'. See dev.idiolect.theory.condition.
    pub conditions: Vec<RecommendationConditions>,
    pub issuing_community: idiolect_records::AtUri,
    /// Ordered sequence of lenses to compose. Length 1 means a single recommended lens.
    pub lens_path: Vec<crate::generated::dev::idiolect::defs::LensRef>,
    pub occurred_at: idiolect_records::Datetime,
    /// Additional structured assumptions the consumer must verify before adopting (same combinator shape as `conditions`). Empty array means no explicit preconditions.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub preconditions: Option<Vec<RecommendationPreconditions>>,
    /// Verification properties this recommendation assumes are in place. Each entry is a specific LensProperty, not just a verification kind, so consumers can check which roundtrip domain / theorem / standard has been established.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub required_verifications: Option<Vec<RecommendationRequiredVerifications>>,
    /// Prior recommendation this one replaces.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub supersedes: Option<idiolect_records::AtUri>,
}

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

/// Atomic predicate: the invocation's use.action is subsumed by the given action under the referenced action-vocabulary. Reuses the same ThUse subsumption machinery that governs any action-based reasoning.
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ConditionActionSubsumedBy {
    /// Action identifier to check subsumption against.
    pub action: String,
    /// Action vocabulary the identifier resolves against. Omit to match the invocation's own vocabulary.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub vocabulary: Option<crate::generated::dev::idiolect::defs::VocabRef>,
}

/// Combinator: conjoin the top two predicates on the evaluation stack.
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ConditionAnd {}

/// Atomic predicate: the invocation's data has the named property.
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ConditionDataHas {
    /// Community-defined property identifier (e.g. 'length>1024', 'contains-pii', 'multilingual').
    pub property: String,
}

/// Combinator: negate the top predicate on the evaluation stack.
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ConditionNot {}

/// Combinator: disjoin the top two predicates on the evaluation stack.
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ConditionOr {}

/// Atomic predicate: the invocation's use.purpose is subsumed by the given purpose under the referenced purpose-vocabulary.
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ConditionPurposeSubsumedBy {
    /// Purpose identifier to check subsumption against.
    pub purpose: String,
    /// Purpose vocabulary the identifier resolves against. Omit to match the invocation's own vocabulary.
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub vocabulary: Option<crate::generated::dev::idiolect::defs::VocabRef>,
}

/// Atomic predicate: the invocation's source schema is the given schema.
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ConditionSourceIs {
    pub schema: crate::generated::dev::idiolect::defs::SchemaRef,
}

/// Atomic predicate: the invocation's target schema is the given schema.
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ConditionTargetIs {
    pub schema: crate::generated::dev::idiolect::defs::SchemaRef,
}

/// RecommendationConditions tagged union.
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "$type")]
pub enum RecommendationConditions {
    #[serde(rename = "dev.idiolect.recommendation#conditionSourceIs")]
    ConditionSourceIs(ConditionSourceIs),
    #[serde(rename = "dev.idiolect.recommendation#conditionTargetIs")]
    ConditionTargetIs(ConditionTargetIs),
    #[serde(rename = "dev.idiolect.recommendation#conditionActionSubsumedBy")]
    ConditionActionSubsumedBy(ConditionActionSubsumedBy),
    #[serde(rename = "dev.idiolect.recommendation#conditionPurposeSubsumedBy")]
    ConditionPurposeSubsumedBy(ConditionPurposeSubsumedBy),
    #[serde(rename = "dev.idiolect.recommendation#conditionDataHas")]
    ConditionDataHas(ConditionDataHas),
    #[serde(rename = "dev.idiolect.recommendation#conditionAnd")]
    ConditionAnd(ConditionAnd),
    #[serde(rename = "dev.idiolect.recommendation#conditionOr")]
    ConditionOr(ConditionOr),
    #[serde(rename = "dev.idiolect.recommendation#conditionNot")]
    ConditionNot(ConditionNot),
}

/// RecommendationPreconditions tagged union.
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "$type")]
pub enum RecommendationPreconditions {
    #[serde(rename = "dev.idiolect.recommendation#conditionSourceIs")]
    ConditionSourceIs(ConditionSourceIs),
    #[serde(rename = "dev.idiolect.recommendation#conditionTargetIs")]
    ConditionTargetIs(ConditionTargetIs),
    #[serde(rename = "dev.idiolect.recommendation#conditionActionSubsumedBy")]
    ConditionActionSubsumedBy(ConditionActionSubsumedBy),
    #[serde(rename = "dev.idiolect.recommendation#conditionPurposeSubsumedBy")]
    ConditionPurposeSubsumedBy(ConditionPurposeSubsumedBy),
    #[serde(rename = "dev.idiolect.recommendation#conditionDataHas")]
    ConditionDataHas(ConditionDataHas),
    #[serde(rename = "dev.idiolect.recommendation#conditionAnd")]
    ConditionAnd(ConditionAnd),
    #[serde(rename = "dev.idiolect.recommendation#conditionOr")]
    ConditionOr(ConditionOr),
    #[serde(rename = "dev.idiolect.recommendation#conditionNot")]
    ConditionNot(ConditionNot),
}

/// RecommendationRequiredVerifications tagged union.
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "$type")]
pub enum RecommendationRequiredVerifications {
    #[serde(rename = "dev.idiolect.defs#lpRoundtrip")]
    LpRoundtrip(crate::generated::dev::idiolect::defs::LpRoundtrip),
    #[serde(rename = "dev.idiolect.defs#lpGenerator")]
    LpGenerator(crate::generated::dev::idiolect::defs::LpGenerator),
    #[serde(rename = "dev.idiolect.defs#lpTheorem")]
    LpTheorem(crate::generated::dev::idiolect::defs::LpTheorem),
    #[serde(rename = "dev.idiolect.defs#lpConformance")]
    LpConformance(crate::generated::dev::idiolect::defs::LpConformance),
    #[serde(rename = "dev.idiolect.defs#lpChecker")]
    LpChecker(crate::generated::dev::idiolect::defs::LpChecker),
    #[serde(rename = "dev.idiolect.defs#lpConvergence")]
    LpConvergence(crate::generated::dev::idiolect::defs::LpConvergence),
    #[serde(rename = "dev.idiolect.defs#lpCoercionLaw")]
    LpCoercionLaw(crate::generated::dev::idiolect::defs::LpCoercionLaw),
}