Skip to main content

nargo_parser/
lib.rs

1#![feature(new_range_api)]
2#![warn(missing_docs)]
3use nargo_ir::IRModule;
4use nargo_types::{NargoValue, Span};
5use std::collections::HashMap;
6
7mod base;
8mod oak_script_parser;
9mod oak_style_parser;
10mod oak_template_parser;
11mod registry;
12pub mod shell;
13pub mod template;
14pub mod vutex;
15
16pub use base::ParseState;
17pub use nargo_types::Cursor;
18pub use oak_script_parser::OakTypeScriptParser;
19pub use oak_style_parser::OakCssParser;
20pub use oak_template_parser::OakVueTemplateParser;
21pub use registry::{MetadataParser, ParserRegistry, ScriptParser, StyleParser, TemplateParser};
22pub use shell::VocShell as Parser;
23
24pub use vutex::{
25    document::{parse_document, parse_frontmatter},
26    Document, DocumentMeta, FrontMatter, FrontMatterParser, MarkdownParser,
27};
28
29/// 解析 Vmz 格式的文件
30///
31/// # Arguments
32///
33/// * `source` - Vmz 源文件内容
34///
35/// # Returns
36///
37/// 解析结果,包含模板、脚本和样式部分
38pub fn parse(source: &str) -> nargo_types::Result<IRModule> {
39    let registry = std::sync::Arc::new(ParserRegistry::new());
40    let mut parser = Parser::new("anonymous.tsx".to_string(), source, registry);
41    parser.parse_all()
42}
43
44pub fn parse_i18n(source: &str, lang: &str) -> nargo_types::Result<HashMap<String, NargoValue>> {
45    let registry = std::sync::Arc::new(ParserRegistry::new());
46    if let Some(parser) = registry.get_metadata_parser(lang) {
47        let mut state = ParseState::new(source);
48        let (val, _trivia) = parser.parse(&mut state, lang)?;
49        if let NargoValue::Object(map) = val {
50            return Ok(map);
51        }
52    }
53    Err(nargo_types::Error::parse_error(format!("Unsupported i18n lang: {}", lang), Span::default()))
54}