encoded/
lib.rs

1//! Macros converting character encodings at compile time
2//! which reduce runtime processing costs and binary size.
3//!
4//! Encoding definitions depend on the [encoding_rs](https://docs.rs/encoding_rs/) crate.
5//! 
6//!
7//! # Examples
8//!
9//! Convert a string literal into encoded bytes array:
10//!
11//! ```
12//! const BYTES: &[u8] = encoded::shift_jis!("漢字");
13//! assert_eq!(BYTES, b"\x8a\xbf\x8e\x9a");
14//! ```
15//!
16//! Can also be used with [std::io::Write]:
17//!
18//! ```
19//! use std::io::{Cursor, Write};
20//!
21//! let mut buff = Cursor::new(Vec::new());
22//! buff.write_all(encoded::shift_jis!("漢字"));
23//! assert_eq!(buff.get_ref(), b"\x8a\xbf\x8e\x9a");
24//! ```
25//!
26//! # Compile Errors
27//!
28//! Argument must be a literal:
29//!
30//! ```compile_fail
31//! const KANJI: &str = "漢字";
32//! const BYTES: &[u8] = encoded::shift_jis!(KANJI);
33//! //                                       ^^^^^
34//! ```
35//!
36//! Any unmappable characters result a compile error:
37//!
38//! ```compile_fail
39//! const BYTES: &[u8] = encoded::shift_jis!("鷗外");
40//! //                                       ^^^^^^
41//! ```
42
43use proc_macro::TokenStream;
44
45mod inner;
46
47/// # Examples
48///
49/// ```
50/// const BYTES: &[u8] = encoded::big5!("漢字");
51/// assert_eq!(BYTES, b"\xba\x7e\xa6\x72");
52/// ```
53///
54/// For more information, see [crate level documentation](crate).
55#[proc_macro]
56pub fn big5(tokens: TokenStream) -> TokenStream {
57    inner::convert(tokens, encoding_rs::BIG5)
58}
59
60/// # Examples
61///
62/// ```
63/// const BYTES: &[u8] = encoded::euc_jp!("漢字");
64/// assert_eq!(BYTES, b"\xb4\xc1\xbb\xfa");
65/// ```
66///
67/// For more information, see [crate level documentation](crate).
68#[proc_macro]
69pub fn euc_jp(tokens: TokenStream) -> TokenStream {
70    inner::convert(tokens, encoding_rs::EUC_JP)
71}
72
73/// # Examples
74///
75/// ```
76/// const BYTES: &[u8] = encoded::euc_kr!("한글");
77/// assert_eq!(BYTES, b"\xc7\xd1\xb1\xdb");
78/// ```
79///
80/// For more information, see [crate level documentation](crate).
81#[proc_macro]
82pub fn euc_kr(tokens: TokenStream) -> TokenStream {
83    inner::convert(tokens, encoding_rs::EUC_KR)
84}
85
86/// # Examples
87///
88/// ```
89/// const BYTES: &[u8] = encoded::gbk!("漢字");
90/// assert_eq!(BYTES, b"\x9d\x68\xd7\xd6");
91/// ```
92///
93/// For more information, see [crate level documentation](crate).
94#[proc_macro]
95pub fn gbk(tokens: TokenStream) -> TokenStream {
96    inner::convert(tokens, encoding_rs::GBK)
97}
98
99/// # Examples
100///
101/// ```
102/// const BYTES: &[u8] = encoded::gb18030!('💻');
103/// assert_eq!(BYTES, b"\x94\x39\xdc\x31");
104/// ```
105///
106/// For more information, see [crate level documentation](crate).
107#[proc_macro]
108pub fn gb18030(tokens: TokenStream) -> TokenStream {
109    inner::convert(tokens, encoding_rs::GB18030)
110}
111
112/// # Examples
113///
114/// ```
115/// const BYTES: &[u8] = encoded::iso_8859_2!("abecadło");
116/// assert_eq!(BYTES, b"abecad\xb3o");
117/// ```
118///
119/// For more information, see [crate level documentation](crate).
120#[proc_macro]
121pub fn iso_8859_2(tokens: TokenStream) -> TokenStream {
122    inner::convert(tokens, encoding_rs::ISO_8859_2)
123}
124
125/// # Examples
126///
127/// ```
128/// const BYTES: &[u8] = encoded::iso_8859_4!("abėcėlė");
129/// assert_eq!(BYTES, b"ab\xecc\xecl\xec");
130/// ```
131///
132/// For more information, see [crate level documentation](crate).
133#[proc_macro]
134pub fn iso_8859_4(tokens: TokenStream) -> TokenStream {
135    inner::convert(tokens, encoding_rs::ISO_8859_4)
136}
137
138/// # Examples
139///
140/// ```
141/// const BYTES: &[u8] = encoded::iso_8859_5!("Кириллица");
142/// assert_eq!(BYTES, b"\xba\xd8\xe0\xd8\xdb\xdb\xd8\xe6\xd0");
143/// ```
144///
145/// For more information, see [crate level documentation](crate).
146#[proc_macro]
147pub fn iso_8859_5(tokens: TokenStream) -> TokenStream {
148    inner::convert(tokens, encoding_rs::ISO_8859_5)
149}
150
151/// # Examples
152///
153/// ```
154/// const BYTES: &[u8] = encoded::iso_8859_6!("الْأَبْجَدِيَّة");
155/// assert_eq!(BYTES, b"\xc7\xe4\xf2\xc3\xee\xc8\xf2\xcc\xee\xcf\xf0\xea\xee\xf1\xc9");
156/// ```
157///
158/// For more information, see [crate level documentation](crate).
159#[proc_macro]
160pub fn iso_8859_6(tokens: TokenStream) -> TokenStream {
161    inner::convert(tokens, encoding_rs::ISO_8859_6)
162}
163
164/// # Examples
165///
166/// ```
167/// const BYTES: &[u8] = encoded::iso_8859_7!("αλφάβητο");
168/// assert_eq!(BYTES, b"\xe1\xeb\xf6\xdc\xe2\xe7\xf4\xef");
169/// ```
170///
171/// For more information, see [crate level documentation](crate).
172#[proc_macro]
173pub fn iso_8859_7(tokens: TokenStream) -> TokenStream {
174    inner::convert(tokens, encoding_rs::ISO_8859_7)
175}
176
177/// # Examples
178///
179/// ```
180/// const BYTES: &[u8] = encoded::iso_8859_8!("אלפבית");
181/// assert_eq!(BYTES, b"\xe0\xec\xf4\xe1\xe9\xfa");
182/// ```
183///
184/// For more information, see [crate level documentation](crate).
185#[proc_macro]
186pub fn iso_8859_8(tokens: TokenStream) -> TokenStream {
187    inner::convert(tokens, encoding_rs::ISO_8859_8)
188}
189
190/// # Examples
191///
192/// ```
193/// const BYTES: &[u8] = encoded::iso_8859_10!("stafrófið");
194/// assert_eq!(BYTES, b"stafr\xf3fi\xf0");
195/// ```
196///
197/// For more information, see [crate level documentation](crate).
198#[proc_macro]
199pub fn iso_8859_10(tokens: TokenStream) -> TokenStream {
200    inner::convert(tokens, encoding_rs::ISO_8859_10)
201}
202
203/// # Examples
204///
205/// ```
206/// const BYTES: &[u8] = encoded::iso_8859_13!("abecadło");
207/// assert_eq!(BYTES, b"abecad\xf9o");
208/// ```
209///
210/// For more information, see [crate level documentation](crate).
211#[proc_macro]
212pub fn iso_8859_13(tokens: TokenStream) -> TokenStream {
213    inner::convert(tokens, encoding_rs::ISO_8859_13)
214}
215
216/// # Examples
217///
218/// ```
219/// const BYTES: &[u8] = encoded::iso_8859_15!("œufs");
220/// assert_eq!(BYTES, b"\xbdufs");
221/// ```
222///
223/// For more information, see [crate level documentation](crate).
224#[proc_macro]
225pub fn iso_8859_15(tokens: TokenStream) -> TokenStream {
226    inner::convert(tokens, encoding_rs::ISO_8859_15)
227}
228
229/// # Examples
230///
231/// ```
232/// const BYTES: &[u8] = encoded::iso_8859_16!("virguliță");
233/// assert_eq!(BYTES, b"virguli\xfe\xe3");
234/// ```
235///
236/// For more information, see [crate level documentation](crate).
237#[proc_macro]
238pub fn iso_8859_16(tokens: TokenStream) -> TokenStream {
239    inner::convert(tokens, encoding_rs::ISO_8859_16)
240}
241
242/// # Examples
243///
244/// ```
245/// const BYTES: &[u8] = encoded::koi8_r!("Кириллица");
246/// assert_eq!(BYTES, b"\xeb\xc9\xd2\xc9\xcc\xcc\xc9\xc3\xc1");
247/// ```
248///
249/// For more information, see [crate level documentation](crate).
250#[proc_macro]
251pub fn koi8_r(tokens: TokenStream) -> TokenStream {
252    inner::convert(tokens, encoding_rs::KOI8_R)
253}
254
255/// # Examples
256///
257/// ```
258/// const BYTES: &[u8] = encoded::koi8_u!("кирилиця");
259/// assert_eq!(BYTES, b"\xcb\xc9\xd2\xc9\xcc\xc9\xc3\xd1");
260/// ```
261///
262/// For more information, see [crate level documentation](crate).
263#[proc_macro]
264pub fn koi8_u(tokens: TokenStream) -> TokenStream {
265    inner::convert(tokens, encoding_rs::KOI8_U)
266}
267
268/// # Examples
269///
270/// ```
271/// const BYTES: &[u8] = encoded::shift_jis!("漢字");
272/// assert_eq!(BYTES, b"\x8a\xbf\x8e\x9a");
273/// ```
274///
275/// For more information, see [crate level documentation](crate).
276#[proc_macro]
277pub fn shift_jis(tokens: TokenStream) -> TokenStream {
278    inner::convert(tokens, encoding_rs::SHIFT_JIS)
279}
280
281/// # Examples
282///
283/// ```
284/// const BYTES: &[u8] = encoded::windows_874!("อักษร");
285/// assert_eq!(BYTES, b"\xcd\xd1\xa1\xc9\xc3");
286/// ```
287///
288/// For more information, see [crate level documentation](crate).
289#[proc_macro]
290pub fn windows_874(tokens: TokenStream) -> TokenStream {
291    inner::convert(tokens, encoding_rs::WINDOWS_874)
292}
293
294/// # Examples
295///
296/// ```
297/// const BYTES: &[u8] = encoded::windows_1251!("Кириллица");
298/// assert_eq!(BYTES, b"\xca\xe8\xf0\xe8\xeb\xeb\xe8\xf6\xe0");
299/// ```
300///
301/// For more information, see [crate level documentation](crate).
302#[proc_macro]
303pub fn windows_1251(tokens: TokenStream) -> TokenStream {
304    inner::convert(tokens, encoding_rs::WINDOWS_1251)
305}
306
307/// # Examples
308///
309/// ```
310/// const BYTES: &[u8] = encoded::windows_1252!("œufs");
311/// assert_eq!(BYTES, b"\x9cufs");
312/// ```
313///
314/// For more information, see [crate level documentation](crate).
315#[proc_macro]
316pub fn windows_1252(tokens: TokenStream) -> TokenStream {
317    inner::convert(tokens, encoding_rs::WINDOWS_1252)
318}
319
320/// # Examples
321///
322/// ```
323/// const BYTES: &[u8] = encoded::windows_1253!("μικρός");
324/// assert_eq!(BYTES, b"\xec\xe9\xea\xf1\xfc\xf2");
325/// ```
326///
327/// For more information, see [crate level documentation](crate).
328#[proc_macro]
329pub fn windows_1253(tokens: TokenStream) -> TokenStream {
330    inner::convert(tokens, encoding_rs::WINDOWS_1253)
331}
332
333/// # Examples
334///
335/// ```
336/// const BYTES: &[u8] = encoded::windows_1254!("sığ");
337/// assert_eq!(BYTES, b"s\xfd\xf0");
338/// ```
339///
340/// For more information, see [crate level documentation](crate).
341#[proc_macro]
342pub fn windows_1254(tokens: TokenStream) -> TokenStream {
343    inner::convert(tokens, encoding_rs::WINDOWS_1254)
344}
345
346/// # Examples
347///
348/// ```
349/// const BYTES: &[u8] = encoded::windows_1255!("נִקּוּד‎");
350/// assert_eq!(BYTES, b"\xf0\xc4\xf7\xcc\xe5\xcc\xe3\xfd");
351/// ```
352///
353/// For more information, see [crate level documentation](crate).
354#[proc_macro]
355pub fn windows_1255(tokens: TokenStream) -> TokenStream {
356    inner::convert(tokens, encoding_rs::WINDOWS_1255)
357}
358
359/// # Examples
360///
361/// ```
362/// const BYTES: &[u8] = encoded::windows_1256!("الْأَبْجَدِيَّة");
363/// assert_eq!(BYTES, b"\xc7\xe1\xfa\xc3\xf3\xc8\xfa\xcc\xf3\xcf\xf6\xed\xf3\xf8\xc9");
364/// ```
365///
366/// For more information, see [crate level documentation](crate).
367#[proc_macro]
368pub fn windows_1256(tokens: TokenStream) -> TokenStream {
369    inner::convert(tokens, encoding_rs::WINDOWS_1256)
370}
371
372/// # Examples
373///
374/// ```
375/// const BYTES: &[u8] = encoded::windows_1257!("„“");
376/// assert_eq!(BYTES, b"\x84\x93");
377/// ```
378///
379/// For more information, see [crate level documentation](crate).
380#[proc_macro]
381pub fn windows_1257(tokens: TokenStream) -> TokenStream {
382    inner::convert(tokens, encoding_rs::WINDOWS_1257)
383}