devalang_wasm/language/syntax/parser/driver/
directive.rs

1use crate::language::syntax::ast::{Statement, StatementKind, Value};
2use anyhow::{Result, anyhow};
3use std::path::Path;
4
5pub fn parse_directive(line: &str, line_number: usize) -> Result<Statement> {
6    if !line.starts_with("@load") {
7        return Ok(Statement::new(
8            StatementKind::Unknown,
9            Value::String(line.to_string()),
10            0,
11            line_number,
12            1,
13        ));
14    }
15
16    let mut rest = line["@load".len()..].trim();
17    if rest.is_empty() {
18        return Err(anyhow!("@load directive requires a path"));
19    }
20
21    let path;
22    if rest.starts_with('"') {
23        if let Some(end) = rest[1..].find('"') {
24            path = rest[1..1 + end].to_string();
25            rest = rest[1 + end + 1..].trim();
26        } else {
27            return Err(anyhow!("unterminated string literal in @load"));
28        }
29    } else {
30        let mut split = rest.splitn(2, char::is_whitespace);
31        path = split.next().unwrap_or_default().trim().to_string();
32        rest = split.next().unwrap_or("").trim();
33    }
34
35    let alias = if rest.starts_with("as ") {
36        rest[3..].trim().to_string()
37    } else {
38        Path::new(&path)
39            .file_stem()
40            .map(|s| s.to_string_lossy().to_string())
41            .unwrap_or_else(|| path.clone())
42    };
43
44    Ok(Statement::new(
45        StatementKind::Load {
46            source: path,
47            alias,
48        },
49        Value::Null,
50        0,
51        line_number,
52        1,
53    ))
54}