rototo 0.1.0-alpha.5

Control plane for runtime configuration of your application.
Documentation
use toml_span::value::Table;

use super::super::index::*;
use super::super::source::SourceDocument;
use super::super::syntax::{ParsedToml, item_location};
use super::fields::{expression_field, integer_field, optional_string_field};

pub(crate) fn project_qualifier(
    document: &SourceDocument,
    toml: &ParsedToml,
    id: &str,
) -> QualifierNode {
    let root = toml.root_table();
    let location = document.document_location();
    let schema_version = root
        .map(|root| integer_field(document, root, "schema_version", location.clone()))
        .unwrap_or_else(|| ProjectField::Missing {
            location: location.clone(),
        });
    let description = root.and_then(|root| optional_string_field(document, root, "description"));
    let when = root
        .map(|root| expression_field(document, root, "when", location.clone()))
        .unwrap_or_else(|| ProjectField::Missing {
            location: location.clone(),
        });
    let predicates = project_predicates(document, root);

    QualifierNode {
        doc: document.id,
        id: id.to_owned(),
        location,
        schema_version,
        description,
        when,
        predicates,
    }
}

fn project_predicates(document: &SourceDocument, root: Option<&Table<'_>>) -> PredicateCollection {
    let Some(root) = root else {
        return PredicateCollection::Absent;
    };
    let Some(item) = root.get("predicate") else {
        return PredicateCollection::Absent;
    };
    PredicateCollection::Invalid {
        location: item_location(document, item),
    }
}