rototo 0.1.0-alpha.8

Control plane for runtime configuration of your application.
Documentation
mod catalog;
mod evaluation_context;
mod fields;
mod governance;
mod layers;
mod lists;
mod manifest;
mod variable;

use super::index::{CustomLintFileNode, SemanticIndex};
use super::source::{DocumentKind, SourceStore};
use super::syntax::SyntaxIndex;

pub(super) use fields::json_from_toml_value;

pub(super) fn build_semantic_index(source: &SourceStore, syntax: &SyntaxIndex) -> SemanticIndex {
    let mut index = SemanticIndex::default();

    for document in source.documents.values() {
        match &document.kind {
            DocumentKind::Manifest => {
                let Some(toml) = syntax.toml.get(&document.id) else {
                    continue;
                };
                index.manifest = Some(manifest::project_manifest(document, toml));
            }
            DocumentKind::Variable { id } => {
                let Some(toml) = syntax.toml.get(&document.id) else {
                    continue;
                };
                index
                    .variables
                    .insert(id.clone(), variable::project_variable(document, toml, id));
            }
            DocumentKind::List { id } => {
                let Some(toml) = syntax.toml.get(&document.id) else {
                    continue;
                };
                index
                    .lists
                    .insert(id.clone(), lists::project_list(document, toml, id));
            }
            DocumentKind::Governance => {
                let Some(toml) = syntax.toml.get(&document.id) else {
                    continue;
                };
                index.governance = Some(governance::project_governance(document, toml));
            }
            DocumentKind::Layer { id } => {
                let Some(toml) = syntax.toml.get(&document.id) else {
                    continue;
                };
                index
                    .layers
                    .insert(id.clone(), layers::project_layer(document, toml, id));
            }
            DocumentKind::Catalog { id } => {
                index
                    .catalogs
                    .insert(id.clone(), catalog::project_catalog(document, syntax, id));
            }
            DocumentKind::CatalogEntry {
                catalog_id,
                entry_id,
            } => {
                let Some(toml) = syntax.toml.get(&document.id) else {
                    continue;
                };
                index
                    .catalog_entries
                    .entry(catalog_id.clone())
                    .or_default()
                    .insert(
                        entry_id.clone(),
                        catalog::project_catalog_entry(document, toml, catalog_id, entry_id),
                    );
            }
            DocumentKind::EvaluationContext { id } => {
                index.evaluation_contexts.insert(
                    id.clone(),
                    evaluation_context::project_evaluation_context(document, syntax, id),
                );
            }
            DocumentKind::EvaluationContextSample {
                evaluation_context_id,
                sample_id,
            } => {
                index
                    .evaluation_context_samples
                    .entry(evaluation_context_id.clone())
                    .or_default()
                    .insert(
                        sample_id.clone(),
                        evaluation_context::project_evaluation_context_sample(
                            document,
                            syntax,
                            evaluation_context_id,
                            sample_id,
                        ),
                    );
            }
            DocumentKind::CustomLint => {
                index.custom_lints.files.insert(
                    document.path.clone(),
                    CustomLintFileNode {
                        path: document.path.clone(),
                        doc: document.id,
                        location: document.document_location(),
                    },
                );
            }
        }
    }
    catalog::compile_catalog_validators(&mut index);
    index
}