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}