topiary_tree_sitter_facade/
language.rs1#[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::*;