1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
use nu_protocol::{
    ast::Block,
    engine::{EngineState, StateWorkingSet},
    PipelineData, Span,
};

use crate::error::{CrateError, CrateResult};

pub trait NewEmpty {
    fn empty() -> Self;
}

impl NewEmpty for Span {
    #[inline]
    fn empty() -> Self {
        Span::new(0, 0)
    }
}

impl NewEmpty for PipelineData {
    #[inline]
    fn empty() -> Self {
        Self::new(Span::empty())
    }
}

pub fn parse_nu_script(engine_state: &mut EngineState, contents: String) -> CrateResult<Block> {
    let mut working_set = StateWorkingSet::new(&engine_state);
    let (block, err) = nu_parser::parse(&mut working_set, None, &contents.into_bytes(), false, &[]);

    if let Some(err) = err {
        Err(CrateError::from(err))
    } else {
        let delta = working_set.render();
        engine_state.merge_delta(delta)?;

        Ok(block)
    }
}