gritpack-searchlib 0.1.0

Compiler-facing resolver and grammar integration surface for Gritpack
Documentation
//! Build-side helpers for publishing grammar data into a Gritpack resolver snapshot.
//!
//! This module is intentionally narrow. It does not expose package installation,
//! refresh, or reconciliation. It only lets a compiler or driver attach grammar
//! specifications and external-driver payloads to an existing Gritpack project state.
//!
//! # Example
//!
//! ```no_run
//! use gritpack_searchlib::build::{persist_project_grammar_data, ResolverBuildInputs};
//! use gritpack_searchlib::grammar::{
//!     CompletenessRules, DeclarationRules, ExternalDriverFilePayload,
//!     ExternalDriverPayload, ExternalDriverRule, GrammarCapabilities, GrammarId,
//!     GrammarSpec,
//! };
//!
//! # async fn demo() -> Result<(), gritpack_searchlib::CliError> {
//! let grammar = GrammarSpec {
//!     id: GrammarId {
//!         dialect: "lumen/1.0.0".to_string(),
//!         name: "modules".to_string(),
//!         version: 1,
//!     },
//!     capabilities: GrammarCapabilities {
//!         authoritative_negative_lookup: true,
//!         supports_prefix_queries: true,
//!         supports_child_enumeration: true,
//!         supports_multi_file_modules: false,
//!     },
//!     source_files: Default::default(),
//!     namespace: Default::default(),
//!     declarations: DeclarationRules::ExternalDriver(ExternalDriverRule {
//!         name: "lumen/modules".to_string(),
//!     }),
//!     completeness: CompletenessRules {
//!         negative_lookup_authoritative: true,
//!         prefix_authoritative: true,
//!         child_enumeration_authoritative: true,
//!     },
//! };
//!
//! let inputs = ResolverBuildInputs {
//!     grammar_specs: vec![grammar],
//!     external_driver_payloads: vec![ExternalDriverPayload {
//!         driver_name: "lumen/modules".to_string(),
//!         files: vec![ExternalDriverFilePayload {
//!             file_path: "/workspace/project/.gritpack/packages/dep/1.0.0/lumen_1.0.0/generic/src/lib.zing"
//!                 .to_string(),
//!             declared_names: vec!["demo::thing".to_string()],
//!         }],
//!     }],
//! };
//!
//! persist_project_grammar_data(std::path::Path::new("/workspace/project"), &inputs).await?;
//! # Ok(())
//! # }
//! ```

use std::path::Path;

use crate::grammar::{ExternalDriverPayload, GrammarSpec};
use crate::layout::project_packages_root;
use crate::state::{
    load_project_resolver_cache, write_state_files_with_grammar_specs_and_external_driver_payloads,
};
use crate::CliError;

#[derive(Debug, Clone, Default)]
pub struct ResolverBuildInputs {
    pub grammar_specs: Vec<GrammarSpec>,
    pub external_driver_payloads: Vec<ExternalDriverPayload>,
}

pub async fn persist_project_grammar_data(
    project_root: &Path,
    inputs: &ResolverBuildInputs,
) -> Result<(), CliError> {
    let install_root = project_packages_root(project_root);
    let cache = load_project_resolver_cache(&install_root).await?;
    let packages_state = cache.packages_state().clone();

    write_state_files_with_grammar_specs_and_external_driver_payloads(
        &install_root,
        &packages_state,
        &inputs.grammar_specs,
        &inputs.external_driver_payloads,
    )
    .await
}