sim-nest 0.2.1

The SIM constellation umbrella facade: one crate that re-exports the runtime kernel, codecs, number domains, and libraries behind features.
Documentation
use sim::kernel::Symbol;
use sim::lib_lang_javascript::{Completion, JavascriptState, JavascriptValue};
use sim::lib_lang_typescript::{
    AnnotationMetadata, AnnotationProvenance, TypeScriptNotation, TypeScriptProgram,
    project_annotation, typescript_gap_manifest, typescript_notation_profile,
};

pub fn admitted_typescript_notation() -> Result<(), Box<dyn std::error::Error>> {
    let source = "let answer: number = 40 + 2; answer;";
    let tree = sim::codec_typescript::parse_module(source)?;
    let lowered = sim::codec_typescript::lower_typescript(&tree)?;
    let type_start = source.find("number").expect("fixture annotation");
    let annotations = lowered
        .annotations
        .iter()
        .map(|annotation| {
            AnnotationMetadata {
                provenance: AnnotationProvenance {
                    source: "number".to_owned(),
                    span: type_start..type_start + "number".len(),
                    context: annotation.context.clone(),
                    origins: vec!["typescript".to_owned(), "javascript".to_owned()],
                },
                projected: project_annotation("number"),
            }
        })
        .collect::<Vec<_>>();
    let program = TypeScriptProgram {
        javascript: lowered.javascript,
        annotations,
    };

    let result = TypeScriptNotation::new(128)?
        .eval(&program, &mut JavascriptState::default())?;
    assert_eq!(result, Completion::Normal(JavascriptValue::Number(42.0)));

    let projected = program.annotations[0]
        .projected
        .as_ref()
        .expect("number has faithful browse metadata");
    let _browsable_shape = projected.shape_ref(Symbol::qualified("typescript", "answer"));
    assert_eq!(
        typescript_notation_profile().symbol,
        Symbol::qualified("language", "typescript-notation")
    );

    assert!(project_annotation("T extends U ? X : Y").is_none());
    assert!(typescript_gap_manifest().contains(&"inference"));
    assert!(typescript_gap_manifest().contains(&"compiler-diagnostics"));
    Ok(())
}