nargo-parser 0.0.0

Nargo parser component
Documentation
#![feature(new_range_api)]
#![warn(missing_docs)]
use nargo_ir::IRModule;
use nargo_types::{NargoValue, Span};
use std::collections::HashMap;

mod base;
mod oak_script_parser;
mod oak_style_parser;
mod oak_template_parser;
mod registry;
pub mod shell;
pub mod template;
pub mod vutex;

pub use base::ParseState;
pub use nargo_types::Cursor;
pub use oak_script_parser::OakTypeScriptParser;
pub use oak_style_parser::OakCssParser;
pub use oak_template_parser::OakVueTemplateParser;
pub use registry::{MetadataParser, ParserRegistry, ScriptParser, StyleParser, TemplateParser};
pub use shell::VocShell as Parser;

pub use vutex::{
    document::{parse_document, parse_frontmatter},
    Document, DocumentMeta, FrontMatter, FrontMatterParser, MarkdownParser,
};

/// 解析 Vmz 格式的文件
///
/// # Arguments
///
/// * `source` - Vmz 源文件内容
///
/// # Returns
///
/// 解析结果,包含模板、脚本和样式部分
pub fn parse(source: &str) -> nargo_types::Result<IRModule> {
    let registry = std::sync::Arc::new(ParserRegistry::new());
    let mut parser = Parser::new("anonymous.tsx".to_string(), source, registry);
    parser.parse_all()
}

pub fn parse_i18n(source: &str, lang: &str) -> nargo_types::Result<HashMap<String, NargoValue>> {
    let registry = std::sync::Arc::new(ParserRegistry::new());
    if let Some(parser) = registry.get_metadata_parser(lang) {
        let mut state = ParseState::new(source);
        let (val, _trivia) = parser.parse(&mut state, lang)?;
        if let NargoValue::Object(map) = val {
            return Ok(map);
        }
    }
    Err(nargo_types::Error::parse_error(format!("Unsupported i18n lang: {}", lang), Span::default()))
}