topiary_tree_sitter_facade/
language.rs

1#[cfg(not(target_arch = "wasm32"))]
2mod native {
3    use std::{borrow::Cow, convert::TryFrom};
4
5    pub struct LanguageRef<'a> {
6        pub(crate) inner: tree_sitter::LanguageRef<'a>,
7    }
8
9    impl LanguageRef<'_> {
10        pub fn field_count(&self) -> usize {
11            self.inner.field_count()
12        }
13    }
14
15    impl<'a> From<tree_sitter::LanguageRef<'a>> for LanguageRef<'a> {
16        fn from(inner: tree_sitter::LanguageRef<'a>) -> Self {
17            LanguageRef { inner }
18        }
19    }
20
21    #[derive(Clone, Eq, PartialEq)]
22    pub struct Language {
23        pub(crate) inner: tree_sitter::Language,
24    }
25
26    impl Language {
27        #[inline]
28        pub fn field_count(&self) -> u16 {
29            u16::try_from(self.inner.field_count()).unwrap()
30        }
31
32        #[inline]
33        pub fn field_id_for_name(
34            &self,
35            field_name: impl AsRef<[u8]>,
36        ) -> Option<std::num::NonZeroU16> {
37            let field_name = field_name.as_ref();
38            self.inner.field_id_for_name(field_name)
39        }
40
41        #[inline]
42        pub fn field_name_for_id(&self, field_id: u16) -> Option<Cow<'_, str>> {
43            self.inner.field_name_for_id(field_id).map(Into::into)
44        }
45
46        #[inline]
47        pub fn id_for_node_kind(&self, kind: &str, named: bool) -> u16 {
48            self.inner.id_for_node_kind(kind, named)
49        }
50
51        #[inline]
52        pub fn node_kind_count(&self) -> u16 {
53            u16::try_from(self.inner.node_kind_count()).unwrap()
54        }
55
56        #[inline]
57        pub fn node_kind_for_id(&self, id: u16) -> Option<Cow<'_, str>> {
58            self.inner.node_kind_for_id(id).map(Into::into)
59        }
60
61        #[inline]
62        pub fn node_kind_is_named(&self, id: u16) -> bool {
63            self.inner.node_kind_is_named(id)
64        }
65
66        #[inline]
67        pub fn node_kind_is_visible(&self, id: u16) -> bool {
68            self.inner.node_kind_is_visible(id)
69        }
70
71        #[inline]
72        pub fn version(&self) -> u32 {
73            u32::try_from(self.inner.abi_version()).unwrap()
74        }
75    }
76
77    impl std::fmt::Debug for Language {
78        fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {
79            std::fmt::Debug::fmt(&self.inner, fmt)
80        }
81    }
82
83    impl From<tree_sitter::Language> for Language {
84        #[inline]
85        fn from(inner: tree_sitter::Language) -> Self {
86            Self { inner }
87        }
88    }
89
90    impl From<tree_sitter_language::LanguageFn> for Language {
91        #[inline]
92        fn from(inner: tree_sitter_language::LanguageFn) -> Self {
93            Language::from(tree_sitter::Language::new(inner))
94        }
95    }
96
97    impl std::panic::RefUnwindSafe for Language {}
98
99    unsafe impl Send for Language {}
100
101    unsafe impl Sync for Language {}
102
103    impl Unpin for Language {}
104
105    impl std::panic::UnwindSafe for Language {}
106}
107
108#[cfg(not(target_arch = "wasm32"))]
109pub use native::*;
110
111#[cfg(target_arch = "wasm32")]
112mod wasm {
113    use std::borrow::Cow;
114
115    #[derive(Clone, PartialEq)]
116    pub struct Language {
117        pub(crate) inner: topiary_web_tree_sitter_sys::Language,
118    }
119
120    impl Language {
121        #[inline]
122        pub fn field_count(&self) -> u16 {
123            self.inner.field_count()
124        }
125
126        #[inline]
127        pub fn field_id_for_name(&self, field_name: impl AsRef<[u8]>) -> Option<u16> {
128            let field_name = field_name.as_ref();
129            let field_name = unsafe { std::str::from_utf8_unchecked(field_name) };
130            self.inner.field_id_for_name(field_name)
131        }
132
133        #[inline]
134        pub fn field_name_for_id(&self, field_id: u16) -> Option<Cow<str>> {
135            self.inner.field_name_for_id(field_id).map(Into::into)
136        }
137
138        #[inline]
139        pub fn id_for_node_kind(&self, kind: &str, named: bool) -> u16 {
140            self.inner.id_for_node_kind(kind, named)
141        }
142
143        #[inline]
144        pub fn node_kind_count(&self) -> u16 {
145            self.inner.node_kind_count()
146        }
147
148        #[inline]
149        pub fn node_kind_for_id(&self, id: u16) -> Option<Cow<str>> {
150            self.inner.node_kind_for_id(id).map(Into::into)
151        }
152
153        #[inline]
154        pub fn node_kind_is_named(&self, id: u16) -> bool {
155            self.inner.node_kind_is_named(id)
156        }
157
158        #[inline]
159        pub fn node_kind_is_visible(&self, id: u16) -> bool {
160            self.inner.node_kind_is_visible(id)
161        }
162
163        #[inline]
164        pub fn version(&self) -> u32 {
165            self.inner.version()
166        }
167    }
168
169    impl std::fmt::Debug for Language {
170        fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {
171            std::fmt::Debug::fmt(&self.inner, fmt)
172        }
173    }
174
175    impl From<topiary_web_tree_sitter_sys::Language> for Language {
176        #[inline]
177        fn from(inner: topiary_web_tree_sitter_sys::Language) -> Self {
178            Self { inner }
179        }
180    }
181
182    impl std::panic::RefUnwindSafe for Language {}
183
184    unsafe impl Send for Language {}
185
186    unsafe impl Sync for Language {}
187
188    impl Unpin for Language {}
189
190    impl std::panic::UnwindSafe for Language {}
191}
192
193#[cfg(target_arch = "wasm32")]
194pub use wasm::*;