Skip to main content

swls_lang_jsonld/
cjs.rs

1use std::collections::HashSet;
2
3use bevy_ecs::{
4    entity::Entity,
5    system::{Commands, Local, Query, Res},
6};
7use swls_core::{
8    lsp_types::Url,
9    prelude::{Label, Wrapped},
10};
11
12use crate::{ecs::ContextRequest, Registry};
13
14#[tracing::instrument(skip(requests, json_ld_vals, res, commander, found))]
15pub fn cjs_loader(
16    requests: Query<&ContextRequest>,
17    json_ld_vals: Query<(Entity, &Label)>,
18    res: Res<Registry>,
19    mut commander: Commands,
20    mut found: Local<HashSet<String>>,
21) {
22    for r in requests {
23        tracing::debug!("jsonld loader {}", r.url.as_str());
24
25        if found.contains(r.url.as_str()) {
26            continue;
27        }
28
29        if let Some(val) = res.1.contexts.get(r.url.as_str()) {
30            tracing::debug!("jsonld loader {} found context", r.url.as_str());
31            found.insert(r.url.as_str().to_string());
32
33            let mut found = false;
34
35            for (e, l) in json_ld_vals.iter() {
36                if l.as_str() == r.url.as_str() {
37                    tracing::debug!("Found entity {}", r.url);
38                    found = true;
39                    commander.entity(e).insert(Wrapped(val.clone()));
40                }
41            }
42
43            if !found {
44                if let Ok(l) = Url::parse(r.url.as_str()) {
45                    tracing::debug!("Spawning {}", r.url);
46                    commander.spawn((Label(l), Wrapped(val.clone())));
47                }
48            }
49        } else {
50            tracing::warn!("no context found for {}", r.url.as_str());
51        }
52    }
53}