1use crate::ast::QualifiedName;
7use crate::ast::advice::AdviceDef;
8use crate::ast::attribute::Attribute;
9use crate::ast::category::{Category, standard_categories};
10use crate::ast::constant::Constant;
11use crate::ast::function::Function;
12use crate::ast::import::Import;
13use crate::ast::infix::Infix;
14use crate::ast::obligation::ObligationDef;
15use crate::ast::policy::{Policy, PolicyId};
16use crate::ast::policycombinator::{
17 PolicyCombinator, protected_policycombinators, standard_policycombinators,
18};
19use crate::ast::policyset::{PolicyEntry, PolicySet};
20use crate::ast::rule::RuleDef;
21use crate::ast::rulecombinator::{
22 RuleCombinator, protected_rulecombinators, standard_rulecombinators,
23};
24use crate::ast::std_attributes::standard_attributes;
25use crate::ast::std_functions::standard_functions;
26use crate::ast::std_infix::standard_infix;
27use crate::ast::typedef::{TypeDef, standard_types};
28use crate::ast::{AsAlfa, SrcLoc};
29use crate::errors::{ParseError, SrcError};
30use log::debug;
31use log::info;
32use std::any::type_name;
33use std::cell::RefCell;
34use std::collections::HashMap;
35use std::collections::HashSet;
36use std::fmt::Debug;
37use std::rc::Rc;
38use std::time::Instant;
39
40pub const SYSTEM_NS: &str = "_A2X";
41pub const PROTECTED_NS: &str = "_A2X.PROTECTED";
42
43#[derive(Debug, PartialEq)]
48pub struct Config {
49 pub base_namespace: Option<String>,
51 pub enable_builtins: bool,
53 pub version: Option<String>,
55}
56
57impl Default for Config {
58 fn default() -> Self {
59 Config {
60 base_namespace: None,
61 enable_builtins: true,
62 version: None,
63 }
64 }
65}
66
67impl Config {
68 #[must_use]
70 pub fn get_base_namespace(&self) -> String {
71 self.base_namespace
72 .as_deref()
73 .unwrap_or("https://sr.ht/~gheartsfield/a2x/alfa/ident/")
74 .to_owned()
75 }
76}
77
78#[derive(Debug, PartialEq, Default)]
83pub struct Resolver<T> {
84 pub elements: RefCell<HashMap<String, Rc<T>>>,
86}
87
88impl<T> Resolver<T>
89where
90 T: QualifiedName,
91 T: Debug,
93{
94 #[must_use]
96 pub fn new() -> Self {
97 Resolver {
98 elements: RefCell::new(HashMap::new()),
99 }
100 }
101
102 fn short_type_name() -> &'static str {
107 let full_type_name = type_name::<T>();
108 match full_type_name.rfind("::") {
109 Some(pos) => &full_type_name[pos + 2..],
110 None => full_type_name,
111 }
112 }
113
114 pub fn names(&self) -> Vec<String> {
116 self.elements.borrow().keys().cloned().collect()
117 }
118
119 pub fn elements(&self) -> Vec<Rc<T>> {
121 let map_ref = self.elements.borrow();
122 let mut items: Vec<_> = map_ref.iter().collect();
123 items.sort_by_key(|(k, _v)| *k);
124 items.into_iter().map(|(_k, v)| v.clone()).collect()
125 }
126
127 pub fn register(&self, elem: Rc<T>) -> Result<(), ParseError> {
139 if let Some(n) = elem.fully_qualified_name() {
141 let mut m = self.elements.borrow_mut();
143 let type_name = Resolver::<T>::short_type_name();
144 debug!("registering {type_name}: {n:?}",);
145 if let std::collections::hash_map::Entry::Vacant(e) = m.entry(n.clone()) {
146 e.insert(elem);
147 Ok(())
148 } else {
149 Err(ParseError::DuplicateSymbol(format!(
161 "Duplicate {type_name} definition: '{n}'"
162 )))
163 }
164 } else {
165 debug!("ignoring registration of anonymous element");
166 Ok(())
167 }
168 }
169
170 pub fn exists_fq(&self, fq_name: &str) -> bool {
172 let e = self.elements.borrow();
174 e.get(fq_name).is_some()
175 }
176
177 fn match_one_and_only(matches: &[Rc<T>]) -> Result<Option<Rc<T>>, ParseError> {
178 if let Some(m) = matches.first() {
179 if matches.len() == 1 {
180 return Ok(Some(m.clone()));
181 }
182 return Err(ParseError::AmbiguousImport(
183 format!(
184 "symbol {:?} resolved to multiple locations from import statements",
185 m.fully_qualified_name()
186 )
187 .to_owned(),
188 ));
189 }
190 Ok(None)
191 }
192
193 #[must_use]
196 fn lookup_source_namespace(&self, symbol: &str, source_ns: &[String]) -> Option<Rc<T>> {
197 {
207 let mut candidate = source_ns.join(".");
208 candidate.push('.');
209 candidate.push_str(symbol);
210 debug!("R1: candidate is {candidate}");
211 let e = self.elements.borrow();
213 if let Some(k) = e.get(&candidate) {
215 return Some(k.clone());
218 }
219 debug!("R1: did not find match");
220 }
221 None
222 }
223
224 #[must_use]
226 fn lookup_root(&self, symbol: &str) -> Option<Rc<T>> {
227 debug!("R2: candidate to match is [{symbol}]");
229 let e = self.elements.borrow();
230 if let Some(k) = e.get(symbol) {
231 debug!("R2 Found key");
232 return Some(k.clone());
233 } else {
234 debug!("R2 did not find key [{symbol}]");
235 }
236 None
237 }
238
239 fn lookup_static_import_child(
243 &self,
244 symbol: &str,
245 source_ns: &[String],
246 static_imports: &Vec<Rc<Import>>,
247 ) -> Result<Option<Rc<T>>, ParseError> {
248 let mut matches = vec![];
255 for i in static_imports {
256 if let Some(last_component) = i.components.last() {
258 if last_component == symbol {
259 debug!("R3: checking static import (relative): {i:?}");
260 let mut candidate = source_ns.join(".");
261 candidate.push('.');
262 let c = i.components.join(".");
263 candidate.push_str(&c);
264 debug!("R3: candidate is {candidate}");
265 let e = self.elements.borrow();
267 if let Some(k) = e.get(&candidate) {
268 debug!("R3: Found value {k:?}");
269 matches.push(k.clone());
270 }
271 }
272 }
273 }
274 if let Some(m) = Self::match_one_and_only(&matches)? {
275 Ok(Some(m))
276 } else {
277 Ok(None)
278 }
279 }
280
281 fn lookup_static_import_qualified(
285 &self,
286 symbol: &str,
287 static_imports: &Vec<Rc<Import>>,
288 ) -> Result<Option<Rc<T>>, ParseError> {
289 let mut matches = vec![];
290 for i in static_imports {
291 if let Some(last_component) = i.components.last() {
293 if last_component == symbol {
294 debug!("R4: checking static import (absolute): {i:?}");
295 let candidate = i.components.join(".");
296 debug!("R4: candidate is {candidate}");
297 let e = self.elements.borrow();
299 if let Some(k) = e.get(&candidate) {
300 debug!("R4: Found key {k:?}");
301 matches.push(k.clone());
302 }
303 }
304 }
305 }
306 if let Some(m) = Self::match_one_and_only(&matches)? {
307 Ok(Some(m))
308 } else {
309 Ok(None)
310 }
311 }
312
313 fn lookup_wildcard_child(
316 &self,
317 symbol: &str,
318 source_ns: &[String],
319 wildcard_imports: &Vec<Rc<Import>>,
320 ) -> Result<Option<Rc<T>>, ParseError> {
321 let mut matches = vec![];
322 for i in wildcard_imports {
323 debug!("R5: checking wildcard import: {i:?}");
325 let mut candidate = source_ns.join(".");
327 candidate.push('.');
328 let c = i.components.join(".");
330 candidate.push_str(&c);
331 candidate.push('.');
333 candidate.push_str(symbol);
334 debug!("R5: candidate is {candidate}");
335 let e = self.elements.borrow();
337 if let Some(k) = e.get(&candidate) {
338 debug!("R5: Found key {k:?}");
339 matches.push(k.clone());
340 }
341 }
342 if let Some(m) = Self::match_one_and_only(&matches)? {
343 Ok(Some(m))
344 } else {
345 Ok(None)
346 }
347 }
348
349 fn lookup_wildcard_qualified(
352 &self,
353 symbol: &str,
354 wildcard_imports: &Vec<Rc<Import>>,
355 ) -> Result<Option<Rc<T>>, ParseError> {
356 let mut matches = vec![];
357 for i in wildcard_imports {
358 debug!("R6: checking static import: {i:?}");
360 let mut candidate = i.components.join(".");
362 candidate.push('.');
364 candidate.push_str(symbol);
365 debug!("R6: candidate is {candidate}");
366 let e = self.elements.borrow();
368 if let Some(k) = e.get(&candidate) {
369 debug!("R6: Found key {k:?}");
370 matches.push(k.clone());
371 }
372 }
373 if let Some(m) = Self::match_one_and_only(&matches)? {
374 Ok(Some(m))
375 } else {
376 Ok(None)
377 }
378 }
379
380 pub fn lookup(
398 &self,
399 symbol: &str,
400 source_ns: &[String],
401 src_loc: Option<&SrcLoc>,
402 imports: Option<&Vec<Rc<Import>>>,
403 ) -> Result<Rc<T>, ParseError> {
404 info!(
405 "doing a lookup of symbol [{}], in namespace [{}]",
406 symbol,
407 source_ns.join(".")
408 );
409 let type_name = Resolver::<T>::short_type_name();
410 if let Some(m) = self.lookup_source_namespace(symbol, source_ns) {
420 return Ok(m);
421 }
422 if let Some(m) = self.lookup_root(symbol) {
424 return Ok(m);
425 }
426 if let Some(imports) = imports {
428 let (wildcard_imports, static_imports): (Vec<_>, Vec<_>) =
430 imports.iter().map(Rc::clone).partition(|n| n.is_wildcard);
431 info!(
432 "There are {} wildcard imports and {} static imports",
433 wildcard_imports.len(),
434 static_imports.len()
435 );
436 if let Some(m) = self.lookup_static_import_child(symbol, source_ns, &static_imports)? {
444 return Ok(m);
445 }
446 if let Some(m) = self.lookup_static_import_qualified(symbol, &static_imports)? {
451 return Ok(m);
452 }
453 if let Some(m) = self.lookup_wildcard_child(symbol, source_ns, &wildcard_imports)? {
455 return Ok(m);
456 }
457 if let Some(m) = self.lookup_wildcard_qualified(symbol, &wildcard_imports)? {
459 return Ok(m);
460 }
461 } else {
462 debug!("There were no import statements, so this {type_name} could not be resolved");
463 }
464 Err(SrcError::err_opt(
465 "All referenced symbols must be defined",
466 &format!("this {type_name} could not be resolved"),
467 src_loc,
468 ))
469 }
470}
471
472#[derive(Debug, Clone, PartialEq, Default)]
474pub struct AttributeDefinition {
475 pub uri: String,
476 pub category: String,
477 pub type_uri: String,
478}
479
480#[derive(Debug, Clone, PartialEq, Default)]
482pub struct AttributeValue {
483 pub attr: AttributeDefinition,
484 pub value: String,
485}
486
487#[derive(Debug, Clone, PartialEq, Default)]
489pub struct TypedLiteral {
490 pub type_uri: String,
491 pub value: String,
492}
493
494#[derive(Debug, PartialEq)]
498pub struct Context {
499 pub config: Config,
501 pub imports: RefCell<HashMap<String, Vec<Rc<Import>>>>,
503 next_id: RefCell<usize>,
505 policyset_id_mapping: RefCell<HashMap<String, usize>>,
507 policy_id_mapping: RefCell<HashMap<String, usize>>,
509 rule_id_mapping: RefCell<HashMap<String, usize>>,
511 policyset_resolver: Resolver<PolicySet>,
513 policy_resolver: Resolver<Policy>,
515 rule_resolver: Resolver<RuleDef>,
517 rulecombinator_resolver: Resolver<RuleCombinator>,
520 policycombinator_resolver: Resolver<PolicyCombinator>,
523 function_resolver: Resolver<Function>,
525 infix_resolver: Resolver<Infix>,
527 attribute_resolver: Resolver<Attribute>,
529 typedef_resolver: Resolver<TypeDef>,
531 advice_resolver: Resolver<AdviceDef>,
533 obligation_resolver: Resolver<ObligationDef>,
535 category_resolver: Resolver<Category>,
537 used_uris: RefCell<HashSet<String>>,
539}
540
541impl Default for Context {
542 fn default() -> Self {
543 Context::new(Config::default())
544 }
545}
546
547impl Context {
548 #[must_use]
556 pub fn new(cfg: Config) -> Self {
557 let mut c = Context {
558 config: cfg,
559 next_id: RefCell::new(0),
560 policy_id_mapping: RefCell::new(HashMap::new()),
561 policyset_id_mapping: RefCell::new(HashMap::new()),
562 rule_id_mapping: RefCell::new(HashMap::new()),
563 policyset_resolver: Resolver::<PolicySet>::new(),
564 policy_resolver: Resolver::<Policy>::new(),
565 rule_resolver: Resolver::<RuleDef>::new(),
566 rulecombinator_resolver: Resolver::<RuleCombinator>::new(),
567 policycombinator_resolver: Resolver::<PolicyCombinator>::new(),
568 function_resolver: Resolver::<Function>::new(),
569 infix_resolver: Resolver::<Infix>::new(),
570 attribute_resolver: Resolver::<Attribute>::new(),
571 typedef_resolver: Resolver::<TypeDef>::new(),
572 advice_resolver: Resolver::<AdviceDef>::new(),
573 obligation_resolver: Resolver::<ObligationDef>::new(),
574 category_resolver: Resolver::<Category>::new(),
575 imports: RefCell::new(HashMap::new()),
576 used_uris: RefCell::new(HashSet::new()),
577 };
578 if c.config.enable_builtins {
579 let start = Instant::now();
580 c.add_standard_defs()
581 .expect("adding standard imports failed");
582
583 let elapsed = start.elapsed().as_micros();
584 info!("Adding built-in alfa elements took {elapsed} microseconds");
585 }
586 c.add_protected_defs()
593 .expect("adding protected imports failed");
594 c
595 }
596
597 pub fn get_fresh_id(&self) -> usize {
600 self.next_id.replace_with(|&mut old| old + 1)
601 }
602
603 pub fn get_next_rule_id(&self, ns: &str) -> usize {
605 let mut rids = self.rule_id_mapping.borrow_mut();
614 *rids
615 .entry(ns.to_owned())
616 .and_modify(|e| *e += 1)
617 .or_insert(0)
618 }
619
620 pub fn get_next_policy_id(&self, ns: &str) -> usize {
622 let mut pids = self.policy_id_mapping.borrow_mut();
623 *pids
624 .entry(ns.to_owned())
625 .and_modify(|e| *e += 1)
626 .or_insert(0)
627 }
628
629 pub fn get_next_policyset_id(&self, ns: &str) -> usize {
631 let mut pids = self.policyset_id_mapping.borrow_mut();
632 *pids
633 .entry(ns.to_owned())
634 .and_modify(|e| *e += 1)
635 .or_insert(0)
636 }
637
638 fn add_protected_defs(&mut self) -> Result<(), ParseError> {
644 info!("adding protected/internal imports under namespace {PROTECTED_NS}");
645 for p in protected_policycombinators() {
647 self.register_policy_combinator(Rc::new(p))?;
648 }
649 for p in protected_rulecombinators() {
650 self.register_rule_combinator(Rc::new(p))?;
651 }
652 Ok(())
653 }
654
655 fn add_standard_defs(&mut self) -> Result<(), ParseError> {
657 info!("adding standard imports under namespace {SYSTEM_NS}");
658 self.register_import(
660 &[SYSTEM_NS.to_string()],
661 Rc::new(Import {
662 components: vec![SYSTEM_NS.to_string()],
663 is_wildcard: true,
664 src_loc: None,
665 }),
666 );
667 for t in standard_types() {
670 self.register_type(Rc::new(t))?;
671 }
672 for r in standard_rulecombinators() {
674 self.register_rule_combinator(Rc::new(r))?;
675 }
676 for r in standard_policycombinators() {
678 self.register_policy_combinator(Rc::new(r))?;
679 }
680 for c in standard_categories() {
682 self.register_category(Rc::new(c))?;
683 }
684 for o in standard_infix() {
686 self.register_infix(Rc::new(o))?;
687 }
688 for a in standard_attributes() {
690 self.register_attribute(Rc::new(a))?;
691 }
692 for f in standard_functions() {
694 self.register_function(Rc::new(f))?;
695 }
696 Ok(())
697 }
698
699 pub fn serialize_builtins<W: std::io::Write>(&self, stream: &mut W) -> std::io::Result<()> {
705 stream.write_all(format!("namespace {SYSTEM_NS} {{\n").as_bytes())?;
707
708 stream.write_all("\n /** Categories **/\n\n".as_bytes())?;
710 for c in self.category_resolver.elements() {
711 stream.write_all(c.to_alfa(1).as_bytes())?;
712 }
713 stream.write_all("\n /** Type Definitions **/\n\n".as_bytes())?;
715 for n in self.typedef_resolver.elements() {
716 stream.write_all(n.to_alfa(1).as_bytes())?;
717 }
718 stream.write_all("\n /** Attributes **/\n\n".as_bytes())?;
720 for a in self.attribute_resolver.elements() {
721 stream.write_all(a.to_alfa(1).as_bytes())?;
722 stream.write_all("\n".as_bytes())?;
724 }
725 stream.write_all("\n /** Policy Combining Algorithms **/\n\n".as_bytes())?;
727 for p in self.policycombinator_resolver.elements() {
728 stream.write_all(p.to_alfa(1).as_bytes())?;
729 }
730 stream.write_all("\n /** Rule Combining Algorithms **/\n\n".as_bytes())?;
732 for r in self.rulecombinator_resolver.elements() {
733 stream.write_all(r.to_alfa(1).as_bytes())?;
734 }
735 stream.write_all("\n /** Functions **/\n\n".as_bytes())?;
737 for f in self.function_resolver.elements() {
738 stream.write_all(f.to_alfa(1).as_bytes())?;
739 }
740 stream.write_all("\n /** Infix Operators **/\n\n".as_bytes())?;
742 for i in self.infix_resolver.elements() {
743 stream.write_all(i.to_alfa(1).as_bytes())?;
744 stream.write_all("\n".as_bytes())?;
746 }
747 stream.write_all("}\n".as_bytes())?;
749 Ok(())
750 }
751
752 pub fn register_import(&self, ns: &[String], rc: Rc<Import>) {
754 let n = ns.join(".");
755 let mut i = self.imports.borrow_mut();
756 if let Some(v) = i.get_mut(&n) {
758 v.push(rc);
759 } else {
760 let import_vec = vec![rc];
761 i.insert(n.to_string(), import_vec);
762 }
763 }
764
765 fn get_imports(&self, source_ns: &[String]) -> Option<Vec<Rc<Import>>> {
767 let imports = self.imports.borrow();
768 let imports_default = imports.get(SYSTEM_NS);
771 if let Some(imports_at_ns) = imports.get(&source_ns.join(".")) {
773 let mut i = vec![];
774 i.extend(imports_at_ns.iter().cloned());
775 if let Some(id) = imports_default {
776 i.extend(id.clone());
777 }
778 Some(i)
779 } else {
780 imports_default.cloned()
781 }
782 }
783
784 pub fn register_rule_combinator(&self, elem: Rc<RuleCombinator>) -> Result<(), ParseError> {
790 self.rulecombinator_resolver.register(elem)
791 }
792
793 pub fn lookup_rule_combinator(
800 &self,
801 symbol: &str,
802 source_ns: &[String],
803 src_loc: Option<&SrcLoc>,
804 ) -> Result<Rc<RuleCombinator>, ParseError> {
805 info!("looking up rule combinator: symbol: {symbol:?}, source: {source_ns:?}");
806 self.rulecombinator_resolver.lookup(
807 symbol,
808 source_ns,
809 src_loc,
810 self.get_imports(source_ns).as_ref(),
811 )
812 }
813
814 pub fn register_policy_combinator(&self, elem: Rc<PolicyCombinator>) -> Result<(), ParseError> {
820 self.policycombinator_resolver.register(elem)
821 }
822
823 pub fn lookup_policy_combinator(
830 &self,
831 symbol: &str,
832 source_ns: &[String],
833 ) -> Result<Rc<PolicyCombinator>, ParseError> {
834 self.policycombinator_resolver.lookup(
835 symbol,
836 source_ns,
837 None,
838 self.get_imports(source_ns).as_ref(),
839 )
840 }
841
842 pub fn register_type(&self, elem: Rc<TypeDef>) -> Result<(), ParseError> {
848 self.typedef_resolver.register(elem)
849 }
850
851 pub fn lookup_type(
857 &self,
858 symbol: &str,
859 source_ns: &[String],
860 ) -> Result<Rc<TypeDef>, ParseError> {
861 self.typedef_resolver.lookup(
862 symbol,
863 source_ns,
864 None,
865 self.get_imports(source_ns).as_ref(),
866 )
867 }
868
869 pub fn register_function(&self, elem: Rc<Function>) -> Result<(), ParseError> {
875 self.function_resolver.register(elem)
876 }
877
878 pub fn lookup_function(
884 &self,
885 symbol: &str,
886 source_ns: &[String],
887 ) -> Result<Rc<Function>, ParseError> {
888 self.function_resolver.lookup(
889 symbol,
890 source_ns,
891 None,
892 self.get_imports(source_ns).as_ref(),
893 )
894 }
895
896 pub fn register_infix(&self, elem: Rc<Infix>) -> Result<(), ParseError> {
902 self.infix_resolver.register(elem)?;
903 Ok(())
904 }
905
906 pub fn register_advice(&self, elem: Rc<AdviceDef>) -> Result<(), ParseError> {
912 self.advice_resolver.register(elem)
913 }
914
915 pub fn lookup_advice(
921 &self,
922 symbol: &str,
923 source_ns: &[String],
924 ) -> Result<Rc<AdviceDef>, ParseError> {
925 self.advice_resolver.lookup(
926 symbol,
927 source_ns,
928 None,
929 self.get_imports(source_ns).as_ref(),
930 )
931 }
932
933 pub fn register_obligation(&self, elem: Rc<ObligationDef>) -> Result<(), ParseError> {
939 self.obligation_resolver.register(elem)
940 }
941
942 pub fn lookup_obligation(
948 &self,
949 symbol: &str,
950 source_ns: &[String],
951 ) -> Result<Rc<ObligationDef>, ParseError> {
952 self.obligation_resolver.lookup(
953 symbol,
954 source_ns,
955 None,
956 self.get_imports(source_ns).as_ref(),
957 )
958 }
959
960 pub fn lookup_infix(
967 &self,
968 symbol: &str,
969 source_ns: &[String],
970 ) -> Result<Rc<Infix>, ParseError> {
971 self.infix_resolver.lookup(
972 symbol,
973 source_ns,
974 None,
975 self.get_imports(source_ns).as_ref(),
976 )
977 }
978
979 pub fn lookup_infix_inverse(
986 &self,
987 symbol: &str,
988 source_ns: &[String],
989 ) -> Result<Rc<Infix>, ParseError> {
990 let i = self.infix_resolver.lookup(
996 symbol,
997 source_ns,
998 None,
999 self.get_imports(source_ns).as_ref(),
1000 )?;
1001 if let Some(inv_sym) = &i.inverse {
1004 Ok(self.infix_resolver.lookup(
1005 inv_sym,
1006 source_ns,
1007 None,
1008 self.get_imports(source_ns).as_ref(),
1009 )?)
1010 } else {
1011 Err(ParseError::InverseInfixNotFound)
1013 }
1014 }
1015
1016 pub fn register_policyset(&self, elem: Rc<PolicySet>) -> Result<(), ParseError> {
1022 for p in &elem.policies {
1029 info!("need to register {p}");
1030 match &p {
1031 PolicyEntry::Ref(_pe) => { }
1033 PolicyEntry::Policy(pe) => {
1034 debug!("registering policy from policyset");
1035 self.register_policy(Rc::new(pe.clone()))?;
1036 }
1037 PolicyEntry::PolicySet(pe) => {
1038 self.register_policyset(Rc::new(pe.clone()))?;
1039 }
1040 }
1041 }
1042 if let PolicyId::PolicyNameAndId(_, i) = &elem.id {
1047 let mut uu = self.used_uris.borrow_mut();
1048 let unique = uu.insert(i.clone());
1049 if !unique {
1050 return Err(ParseError::DuplicateURI(i.clone()));
1051 }
1052 };
1053 if let Some(fq) = &elem.fully_qualified_name() {
1056 if self.policy_resolver.exists_fq(fq) {
1057 return Err(ParseError::DuplicatePolicyEntity(fq.clone()));
1058 }
1059 }
1060
1061 self.policyset_resolver.register(elem)
1062 }
1063
1064 pub fn lookup_policyset(
1070 &self,
1071 symbol: &str,
1072 source_ns: &[String],
1073 ) -> Result<Rc<PolicySet>, ParseError> {
1074 let p = self.policyset_resolver.lookup(
1075 symbol,
1076 source_ns,
1077 None,
1078 self.get_imports(source_ns).as_ref(),
1079 );
1080 p
1081 }
1082
1083 pub fn register_policy(&self, elem: Rc<Policy>) -> Result<(), ParseError> {
1089 if let PolicyId::PolicyNameAndId(_, i) = &elem.id {
1099 let mut uu = self.used_uris.borrow_mut();
1100 let unique = uu.insert(i.clone());
1101 if !unique {
1102 return Err(ParseError::DuplicateURI(i.clone()));
1103 }
1104 };
1105 if let Some(fq) = &elem.fully_qualified_name() {
1108 if self.policyset_resolver.exists_fq(fq) {
1109 return Err(ParseError::DuplicatePolicyEntity(fq.clone()));
1110 }
1111 }
1112 self.policy_resolver.register(elem)
1113 }
1114
1115 pub fn lookup_policy(
1121 &self,
1122 symbol: &str,
1123 source_ns: &[String],
1124 ) -> Result<Rc<Policy>, ParseError> {
1125 info!(
1126 "looking up policy with imports: {:?}",
1127 self.get_imports(source_ns)
1128 );
1129 let p = self.policy_resolver.lookup(
1130 symbol,
1131 source_ns,
1132 None,
1133 self.get_imports(source_ns).as_ref(),
1134 );
1135 info!("finished policy resolver");
1136 p
1137 }
1138
1139 pub fn register_rule(&self, elem: Rc<RuleDef>) -> Result<(), ParseError> {
1145 self.rule_resolver.register(elem)
1146 }
1147
1148 pub fn lookup_rule(
1154 &self,
1155 symbol: &str,
1156 source_ns: &[String],
1157 src_loc: Option<&SrcLoc>,
1158 ) -> Result<Rc<RuleDef>, ParseError> {
1159 self.rule_resolver.lookup(
1160 symbol,
1161 source_ns,
1162 src_loc,
1163 self.get_imports(source_ns).as_ref(),
1164 )
1165 }
1166
1167 pub fn register_attribute(&self, elem: Rc<Attribute>) -> Result<(), ParseError> {
1173 self.attribute_resolver.register(elem)
1174 }
1175
1176 pub fn lookup_attribute(
1183 &self,
1184 symbol: &str,
1185 source_ns: &[String],
1186 ) -> Result<Rc<Attribute>, ParseError> {
1187 self.attribute_resolver.lookup(
1188 symbol,
1189 source_ns,
1190 None,
1191 self.get_imports(source_ns).as_ref(),
1192 )
1193 }
1194
1195 pub fn lookup_attribute_with_loc(
1196 &self,
1197 symbol: &str,
1198 source_ns: &[String],
1199 src_loc: Option<&SrcLoc>,
1200 ) -> Result<Rc<Attribute>, ParseError> {
1201 self.attribute_resolver.lookup(
1202 symbol,
1203 source_ns,
1204 src_loc,
1205 self.get_imports(source_ns).as_ref(),
1206 )
1207 }
1208
1209 pub fn register_category(&self, elem: Rc<Category>) -> Result<(), ParseError> {
1215 self.category_resolver.register(elem)
1216 }
1217
1218 pub fn lookup_category(
1225 &self,
1226 symbol: &str,
1227 source_ns: &[String],
1228 ) -> Result<Rc<Category>, ParseError> {
1229 self.category_resolver.lookup(
1230 symbol,
1231 source_ns,
1232 None,
1233 self.get_imports(source_ns).as_ref(),
1234 )
1235 }
1236
1237 pub fn constant_to_typedliteral(
1244 &self,
1245 c: Constant,
1246 source_ns: &[String],
1247 ) -> Result<TypedLiteral, ParseError> {
1248 match c {
1249 Constant::String(s) => Ok(TypedLiteral {
1250 type_uri: crate::ast::typedef::STRING_URI.to_string(),
1251 value: s,
1252 }),
1253 Constant::Integer(s) => Ok(TypedLiteral {
1254 type_uri: crate::ast::typedef::INTEGER_URI.to_string(),
1255 value: s,
1256 }),
1257 Constant::Double(s) => Ok(TypedLiteral {
1258 type_uri: crate::ast::typedef::DOUBLE_URI.to_string(),
1259 value: s,
1260 }),
1261 Constant::Boolean(b) => Ok(TypedLiteral {
1262 type_uri: crate::ast::typedef::BOOLEAN_URI.to_string(),
1263 value: b.to_string(),
1264 }),
1265 Constant::Custom(ct, s) => {
1266 let t = self.typedef_resolver.lookup(
1269 &ct.name,
1270 source_ns,
1271 None,
1272 self.get_imports(source_ns).as_ref(),
1273 )?;
1274 Ok(TypedLiteral {
1275 type_uri: t.uri.to_string(),
1276 value: s,
1277 })
1278 }
1279 Constant::Undefined => Err(ParseError::AstConvertError),
1280 }
1281 }
1282}