devalang_wasm/language/syntax/parser/driver/
directive.rs1use 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}