lang_jsonld/ecs/
parse.rs

1use bevy_ecs::prelude::*;
2use lsp_core::{
3    components::*,
4    prelude::{Tokens, Triples},
5};
6use tracing::{info, instrument};
7
8use crate::{
9    lang::{parser::parse, tokenizer::tokenize, triples},
10    JsonLd,
11};
12
13#[instrument(skip(query, commands))]
14pub fn parse_source(
15    query: Query<(Entity, &Source), (Changed<Source>, With<JsonLd>)>,
16    mut commands: Commands,
17) {
18    for (entity, source) in &query {
19        let (tok, es) = tokenize(source.0.as_str());
20        info!("tokenized  {} tokens ({} errors)", tok.len(), es.len());
21        commands.entity(entity).insert((Tokens(tok), Errors(es)));
22    }
23}
24
25#[instrument(skip(query, commands))]
26pub fn parse_jsonld_system(
27    query: Query<(Entity, &Source, &Tokens, &Label), (Changed<Tokens>, With<JsonLd>)>,
28    mut commands: Commands,
29    config: Res<ServerConfig>,
30) {
31    if !config.config.jsonld.unwrap_or(true) {
32        return;
33    }
34    for (entity, source, tokens, label) in &query {
35        let (jsonld, es) = parse(source.as_str(), tokens.0.clone());
36        info!("{} triples ({} errors)", label.0, es.len());
37        if es.is_empty() {
38            let element = Element::<JsonLd>(jsonld);
39            commands
40                .entity(entity)
41                .insert((element, Errors(es)))
42                .remove::<Dirty>();
43        } else {
44            let element = Element::<JsonLd>(jsonld);
45            commands.entity(entity).insert((Errors(es), element, Dirty));
46        }
47    }
48}
49
50#[instrument(skip(query, commands))]
51pub fn derive_triples(
52    query: Query<(Entity, &Label, &Element<JsonLd>), Changed<Element<JsonLd>>>,
53    mut commands: Commands,
54) {
55    for (e, l, el) in &query {
56        let prefix = triples::derive_prefixes(&el, &l.0);
57        let triples = triples::derive_triples(&el, &prefix);
58        commands.entity(e).insert((Triples(triples), prefix));
59    }
60}