claw_resolver/
wit.rs

1use thiserror::Error;
2
3use miette::Diagnostic;
4
5pub use wit_parser::{
6    Function, Interface, InterfaceId, PackageName, Resolve, Type, TypeDef, TypeDefKind, TypeId,
7    TypeOwner,
8};
9
10#[derive(Error, Debug, Diagnostic)]
11pub enum WitError {
12    #[error("Package {package} does not exist")]
13    NoSuchPackage { package: PackageName },
14    #[error("Interface {interface} does not exist in package {package}")]
15    NoSuchInterface {
16        package: PackageName,
17        interface: String,
18    },
19    #[error("Item {item} does not exists in interface {interface}")]
20    NoSuchItem { interface: String, item: String },
21}
22
23#[derive(Debug)]
24pub struct ResolvedWit {
25    pub resolve: Resolve,
26}
27
28pub enum WitItem {
29    Func(Function),
30    Type(),
31}
32
33impl ResolvedWit {
34    pub fn new(resolve: Resolve) -> Self {
35        Self { resolve }
36    }
37
38    pub fn lookup_interface(
39        &self,
40        package_name: &PackageName,
41        interface: &String,
42    ) -> Result<InterfaceId, WitError> {
43        let package_id = self.resolve.package_names.get(package_name);
44        let package_id = match package_id {
45            Some(id) => *id,
46            None => {
47                return Err(WitError::NoSuchPackage {
48                    package: package_name.clone(),
49                })
50            }
51        };
52
53        let package = self.resolve.packages.get(package_id).unwrap();
54
55        let interface_id = package.interfaces.get(interface);
56        let interface_id = match interface_id {
57            Some(id) => *id,
58            None => {
59                return Err(WitError::NoSuchInterface {
60                    package: package_name.clone(),
61                    interface: interface.clone(),
62                })
63            }
64        };
65
66        Ok(interface_id)
67    }
68
69    pub fn get_interface(&self, interface_id: InterfaceId) -> &Interface {
70        self.resolve.interfaces.get(interface_id).unwrap()
71    }
72
73    pub fn lookup_func(&self, interface_id: InterfaceId, name: &str) -> Option<&Function> {
74        let interface = self.get_interface(interface_id);
75        interface.functions.get(name)
76    }
77
78    pub fn lookup_type(&self, interface_id: InterfaceId, name: &str) -> Option<&TypeDef> {
79        let interface = self.get_interface(interface_id);
80        let type_id = interface.types.get(name)?;
81        Some(self.resolve.types.get(*type_id).unwrap())
82    }
83}