1use core::{mem, num};
4use lexical_util::ascii::{is_valid_ascii, is_valid_letter_slice};
5use lexical_util::constants::FormattedSize;
6use lexical_util::error::Error;
7use lexical_util::format::NumberFormat;
8use lexical_util::options::{self, WriteOptions};
9use lexical_util::result::Result;
10use static_assertions::const_assert;
11
12pub type OptionUsize = Option<num::NonZeroUsize>;
14
15pub type OptionI32 = Option<num::NonZeroI32>;
17
18const_assert!(mem::size_of::<OptionUsize>() == mem::size_of::<usize>());
20const_assert!(mem::size_of::<OptionI32>() == mem::size_of::<i32>());
21
22#[derive(Debug, Copy, Clone, PartialEq, Eq)]
24pub enum RoundMode {
25 Round,
27 Truncate,
29}
30
31const MAX_SPECIAL_STRING_LENGTH: usize = 50;
33const_assert!(MAX_SPECIAL_STRING_LENGTH < f32::FORMATTED_SIZE_DECIMAL);
34
35#[derive(Debug, Clone, PartialEq, Eq)]
37pub struct OptionsBuilder {
38 max_significant_digits: OptionUsize,
41 min_significant_digits: OptionUsize,
48 positive_exponent_break: OptionI32,
52 negative_exponent_break: OptionI32,
56 round_mode: RoundMode,
58 trim_floats: bool,
60 exponent: u8,
62 decimal_point: u8,
64 nan_string: Option<&'static [u8]>,
66 inf_string: Option<&'static [u8]>,
68}
69
70impl OptionsBuilder {
71 #[inline(always)]
74 pub const fn new() -> Self {
75 Self {
76 max_significant_digits: None,
77 min_significant_digits: None,
78 positive_exponent_break: None,
79 negative_exponent_break: None,
80 round_mode: RoundMode::Round,
81 trim_floats: false,
82 exponent: b'e',
83 decimal_point: b'.',
84 nan_string: Some(b"NaN"),
85 inf_string: Some(b"inf"),
86 }
87 }
88
89 #[inline(always)]
93 pub const fn get_max_significant_digits(&self) -> OptionUsize {
94 self.max_significant_digits
95 }
96
97 #[inline(always)]
99 pub const fn get_min_significant_digits(&self) -> OptionUsize {
100 self.min_significant_digits
101 }
102
103 #[inline(always)]
105 pub const fn get_positive_exponent_break(&self) -> OptionI32 {
106 self.positive_exponent_break
107 }
108
109 #[inline(always)]
111 pub const fn get_negative_exponent_break(&self) -> OptionI32 {
112 self.negative_exponent_break
113 }
114
115 #[inline(always)]
117 pub const fn get_round_mode(&self) -> RoundMode {
118 self.round_mode
119 }
120
121 #[inline(always)]
123 pub const fn get_trim_floats(&self) -> bool {
124 self.trim_floats
125 }
126
127 #[inline(always)]
129 pub const fn get_exponent(&self) -> u8 {
130 self.exponent
131 }
132
133 #[inline(always)]
135 pub const fn get_decimal_point(&self) -> u8 {
136 self.decimal_point
137 }
138
139 #[inline(always)]
141 pub const fn get_nan_string(&self) -> Option<&'static [u8]> {
142 self.nan_string
143 }
144
145 #[inline(always)]
147 pub const fn get_inf_string(&self) -> Option<&'static [u8]> {
148 self.inf_string
149 }
150
151 #[inline(always)]
155 pub const fn max_significant_digits(mut self, max_significant_digits: OptionUsize) -> Self {
156 self.max_significant_digits = max_significant_digits;
157 self
158 }
159
160 #[inline(always)]
162 pub const fn min_significant_digits(mut self, min_significant_digits: OptionUsize) -> Self {
163 self.min_significant_digits = min_significant_digits;
164 self
165 }
166
167 #[inline(always)]
169 pub const fn positive_exponent_break(mut self, positive_exponent_break: OptionI32) -> Self {
170 self.positive_exponent_break = positive_exponent_break;
171 self
172 }
173
174 #[inline(always)]
176 pub const fn negative_exponent_break(mut self, negative_exponent_break: OptionI32) -> Self {
177 self.negative_exponent_break = negative_exponent_break;
178 self
179 }
180
181 #[inline(always)]
183 pub const fn round_mode(mut self, round_mode: RoundMode) -> Self {
184 self.round_mode = round_mode;
185 self
186 }
187
188 #[inline(always)]
190 pub const fn trim_floats(mut self, trim_floats: bool) -> Self {
191 self.trim_floats = trim_floats;
192 self
193 }
194
195 #[inline(always)]
197 pub const fn exponent(mut self, exponent: u8) -> Self {
198 self.exponent = exponent;
199 self
200 }
201
202 #[inline(always)]
204 pub const fn decimal_point(mut self, decimal_point: u8) -> Self {
205 self.decimal_point = decimal_point;
206 self
207 }
208
209 #[inline(always)]
211 pub const fn nan_string(mut self, nan_string: Option<&'static [u8]>) -> Self {
212 self.nan_string = nan_string;
213 self
214 }
215
216 #[inline(always)]
218 pub const fn inf_string(mut self, inf_string: Option<&'static [u8]>) -> Self {
219 self.inf_string = inf_string;
220 self
221 }
222
223 #[inline(always)]
227 #[allow(clippy::if_same_then_else, clippy::needless_bool)]
228 pub const fn nan_str_is_valid(&self) -> bool {
229 if self.nan_string.is_none() {
230 return true;
231 }
232
233 let nan = unwrap_str(self.nan_string);
234 let length = nan.len();
235 if length == 0 || length > MAX_SPECIAL_STRING_LENGTH {
236 false
237 } else if !matches!(nan[0], b'N' | b'n') {
238 false
239 } else if !is_valid_letter_slice(nan) {
240 false
241 } else {
242 true
243 }
244 }
245
246 #[inline(always)]
248 #[allow(clippy::if_same_then_else, clippy::needless_bool)]
249 pub const fn inf_str_is_valid(&self) -> bool {
250 if self.inf_string.is_none() {
251 return true;
252 }
253
254 let inf = unwrap_str(self.inf_string);
255 let length = inf.len();
256 if length == 0 || length > MAX_SPECIAL_STRING_LENGTH {
257 false
258 } else if !matches!(inf[0], b'I' | b'i') {
259 false
260 } else if !is_valid_letter_slice(inf) {
261 false
262 } else {
263 true
264 }
265 }
266
267 #[inline(always)]
269 #[allow(clippy::if_same_then_else, clippy::needless_bool)]
270 pub const fn is_valid(&self) -> bool {
271 if !is_valid_ascii(self.exponent) {
272 false
273 } else if !is_valid_ascii(self.decimal_point) {
274 false
275 } else if !self.nan_str_is_valid() {
276 false
277 } else if !self.inf_str_is_valid() {
278 false
279 } else {
280 true
281 }
282 }
283
284 #[inline(always)]
292 pub const unsafe fn build_unchecked(&self) -> Options {
293 Options {
294 max_significant_digits: self.max_significant_digits,
295 min_significant_digits: self.min_significant_digits,
296 positive_exponent_break: self.positive_exponent_break,
297 negative_exponent_break: self.negative_exponent_break,
298 round_mode: self.round_mode,
299 trim_floats: self.trim_floats,
300 exponent: self.exponent,
301 decimal_point: self.decimal_point,
302 nan_string: self.nan_string,
303 inf_string: self.inf_string,
304 }
305 }
306
307 #[inline(always)]
309 #[allow(clippy::if_same_then_else)]
310 pub const fn build(&self) -> Result<Options> {
311 if self.nan_string.is_some() {
312 let nan = unwrap_str(self.nan_string);
313 if nan.is_empty() || !matches!(nan[0], b'N' | b'n') {
314 return Err(Error::InvalidNanString);
315 } else if !is_valid_letter_slice(nan) {
316 return Err(Error::InvalidNanString);
317 } else if nan.len() > MAX_SPECIAL_STRING_LENGTH {
318 return Err(Error::NanStringTooLong);
319 }
320 }
321
322 if self.inf_string.is_some() {
323 let inf = unwrap_str(self.inf_string);
324 if inf.is_empty() || !matches!(inf[0], b'I' | b'i') {
325 return Err(Error::InvalidInfString);
326 } else if !is_valid_letter_slice(inf) {
327 return Err(Error::InvalidInfString);
328 } else if inf.len() > MAX_SPECIAL_STRING_LENGTH {
329 return Err(Error::InfStringTooLong);
330 }
331 }
332
333 let min_digits = unwrap_or_zero_usize(self.min_significant_digits);
334 let max_digits = unwrap_or_max_usize(self.max_significant_digits);
335 if max_digits < min_digits {
336 Err(Error::InvalidFloatPrecision)
337 } else if unwrap_or_zero_i32(self.negative_exponent_break) > 0 {
338 Err(Error::InvalidNegativeExponentBreak)
339 } else if unwrap_or_zero_i32(self.positive_exponent_break) < 0 {
340 Err(Error::InvalidPositiveExponentBreak)
341 } else if !is_valid_ascii(self.exponent) {
342 Err(Error::InvalidExponentSymbol)
343 } else if !is_valid_ascii(self.decimal_point) {
344 Err(Error::InvalidDecimalPoint)
345 } else {
346 Ok(unsafe { self.build_unchecked() })
348 }
349 }
350}
351
352impl Default for OptionsBuilder {
353 #[inline(always)]
354 fn default() -> Self {
355 Self::new()
356 }
357}
358
359#[derive(Debug, Clone, PartialEq, Eq)]
377pub struct Options {
378 max_significant_digits: OptionUsize,
381 min_significant_digits: OptionUsize,
384 positive_exponent_break: OptionI32,
388 negative_exponent_break: OptionI32,
392 round_mode: RoundMode,
394 trim_floats: bool,
396 exponent: u8,
398 decimal_point: u8,
400 nan_string: Option<&'static [u8]>,
402 inf_string: Option<&'static [u8]>,
404}
405
406impl Options {
407 #[inline(always)]
411 pub const fn new() -> Self {
412 unsafe { Self::builder().build_unchecked() }
414 }
415
416 #[inline(always)]
418 #[cfg(feature = "power-of-two")]
419 pub const fn from_radix(radix: u8) -> Self {
420 let mut builder = Self::builder();
424 if radix >= 15 {
425 builder = builder.exponent(b'^');
426 }
427 unsafe { builder.build_unchecked() }
429 }
430
431 #[inline(always)]
435 pub const fn is_valid(&self) -> bool {
436 self.rebuild().is_valid()
437 }
438
439 #[inline(always)]
441 pub const fn max_significant_digits(&self) -> OptionUsize {
442 self.max_significant_digits
443 }
444
445 #[inline(always)]
447 pub const fn min_significant_digits(&self) -> OptionUsize {
448 self.min_significant_digits
449 }
450
451 #[inline(always)]
453 pub const fn positive_exponent_break(&self) -> OptionI32 {
454 self.positive_exponent_break
455 }
456
457 #[inline(always)]
459 pub const fn negative_exponent_break(&self) -> OptionI32 {
460 self.negative_exponent_break
461 }
462
463 #[inline(always)]
465 pub const fn round_mode(&self) -> RoundMode {
466 self.round_mode
467 }
468
469 #[inline(always)]
471 pub const fn trim_floats(&self) -> bool {
472 self.trim_floats
473 }
474
475 #[inline(always)]
477 pub const fn exponent(&self) -> u8 {
478 self.exponent
479 }
480
481 #[inline(always)]
483 pub const fn decimal_point(&self) -> u8 {
484 self.decimal_point
485 }
486
487 #[inline(always)]
489 pub const fn nan_string(&self) -> Option<&'static [u8]> {
490 self.nan_string
491 }
492
493 #[inline(always)]
495 pub const fn inf_string(&self) -> Option<&'static [u8]> {
496 self.inf_string
497 }
498
499 #[inline(always)]
508 pub unsafe fn set_max_significant_digits(&mut self, max_significant_digits: OptionUsize) {
509 self.max_significant_digits = max_significant_digits
510 }
511
512 #[inline(always)]
519 pub unsafe fn set_min_significant_digits(&mut self, min_significant_digits: OptionUsize) {
520 self.min_significant_digits = min_significant_digits
521 }
522
523 #[inline(always)]
529 pub unsafe fn set_positive_exponent_break(&mut self, positive_exponent_break: OptionI32) {
530 self.positive_exponent_break = positive_exponent_break;
531 }
532
533 #[inline(always)]
539 pub unsafe fn set_negative_exponent_break(&mut self, negative_exponent_break: OptionI32) {
540 self.negative_exponent_break = negative_exponent_break;
541 }
542
543 #[inline(always)]
549 pub unsafe fn set_round_mode(&mut self, round_mode: RoundMode) {
550 self.round_mode = round_mode;
551 }
552
553 #[inline(always)]
560 pub unsafe fn set_trim_floats(&mut self, trim_floats: bool) {
561 self.trim_floats = trim_floats;
562 }
563
564 #[inline(always)]
571 pub unsafe fn set_exponent(&mut self, exponent: u8) {
572 self.exponent = exponent;
573 }
574
575 #[inline(always)]
582 pub unsafe fn set_decimal_point(&mut self, decimal_point: u8) {
583 self.decimal_point = decimal_point;
584 }
585
586 #[inline(always)]
595 pub unsafe fn set_nan_string(&mut self, nan_string: Option<&'static [u8]>) {
596 self.nan_string = nan_string
597 }
598
599 #[inline(always)]
608 pub unsafe fn set_inf_string(&mut self, inf_string: Option<&'static [u8]>) {
609 self.inf_string = inf_string
610 }
611
612 #[inline(always)]
616 pub const fn builder() -> OptionsBuilder {
617 OptionsBuilder::new()
618 }
619
620 #[inline(always)]
622 pub const fn rebuild(&self) -> OptionsBuilder {
623 OptionsBuilder {
624 max_significant_digits: self.max_significant_digits,
625 min_significant_digits: self.min_significant_digits,
626 positive_exponent_break: self.positive_exponent_break,
627 negative_exponent_break: self.negative_exponent_break,
628 round_mode: self.round_mode,
629 trim_floats: self.trim_floats,
630 exponent: self.exponent,
631 decimal_point: self.decimal_point,
632 nan_string: self.nan_string,
633 inf_string: self.inf_string,
634 }
635 }
636}
637
638impl Default for Options {
639 #[inline(always)]
640 fn default() -> Self {
641 Self::new()
642 }
643}
644
645impl WriteOptions for Options {
646 #[inline(always)]
647 fn is_valid(&self) -> bool {
648 Self::is_valid(self)
649 }
650
651 #[inline(always)]
652 fn buffer_size<T: FormattedSize, const FORMAT: u128>(&self) -> usize {
653 let format = NumberFormat::<{ FORMAT }> {};
654
655 let mut count: usize = 2;
657
658 if !format.no_exponent_notation() {
661 let min_exp = self.negative_exponent_break().map_or(-5, |x| x.get());
662 let max_exp = self.positive_exponent_break().map_or(9, |x| x.get());
663 let exp = min_exp.abs().max(max_exp) as usize;
664 if cfg!(feature = "power-of-two") && exp < 13 {
665 count += 13;
667 } else if exp < 5 {
668 count += 5;
670 } else {
671 count += exp;
673 }
674 } else if cfg!(feature = "power-of-two") {
675 count += 1075;
677 } else {
678 count += 324;
680 }
681
682 let radix = format.radix();
684 let formatted_digits = if radix == 10 {
685 28
687 } else {
688 64
699 };
700 let digits = if let Some(max_digits) = self.max_significant_digits() {
701 formatted_digits.min(max_digits.get())
702 } else {
703 formatted_digits
704 };
705 let digits = if let Some(min_digits) = self.min_significant_digits() {
706 digits.max(min_digits.get())
707 } else {
708 formatted_digits
709 };
710 count += digits;
711
712 count
713 }
714}
715
716macro_rules! unwrap_or_zero {
718 ($name:ident, $opt:ident, $t:ident) => {
719 #[inline(always)]
721 const fn $name(option: $opt) -> $t {
722 match option {
723 Some(x) => x.get(),
724 None => 0,
725 }
726 }
727 };
728}
729
730unwrap_or_zero!(unwrap_or_zero_usize, OptionUsize, usize);
731unwrap_or_zero!(unwrap_or_zero_i32, OptionI32, i32);
732
733#[inline(always)]
735const fn unwrap_or_max_usize(option: OptionUsize) -> usize {
736 match option {
737 Some(x) => x.get(),
738 None => usize::MAX,
739 }
740}
741
742#[inline(always)]
744const fn unwrap_str(option: Option<&'static [u8]>) -> &'static [u8] {
745 match option {
746 Some(x) => x,
747 None => &[],
748 }
749}
750
751#[rustfmt::skip]
762pub const STANDARD: Options = Options::new();
763const_assert!(STANDARD.is_valid());
764
765#[rustfmt::skip]
768pub const DECIMAL_COMMA: Options = unsafe {
769 Options::builder()
770 .decimal_point(b',')
771 .build_unchecked()
772};
773const_assert!(DECIMAL_COMMA.is_valid());
774
775#[rustfmt::skip]
777pub const HEX_FLOAT: Options = unsafe {
778 Options::builder()
779 .exponent(b'p')
780 .build_unchecked()
781};
782const_assert!(HEX_FLOAT.is_valid());
783
784#[rustfmt::skip]
787pub const CARAT_EXPONENT: Options = unsafe {
788 Options::builder()
789 .exponent(b'^')
790 .build_unchecked()
791};
792const_assert!(CARAT_EXPONENT.is_valid());
793
794#[rustfmt::skip]
796pub const RUST_LITERAL: Options = unsafe {
797 Options::builder()
798 .nan_string(options::RUST_LITERAL)
799 .inf_string(options::RUST_LITERAL)
800 .build_unchecked()
801};
802const_assert!(RUST_LITERAL.is_valid());
803
804#[rustfmt::skip]
806pub const PYTHON_LITERAL: Options = unsafe {
807 Options::builder()
808 .nan_string(options::PYTHON_LITERAL)
809 .inf_string(options::PYTHON_LITERAL)
810 .build_unchecked()
811};
812const_assert!(PYTHON_LITERAL.is_valid());
813
814#[rustfmt::skip]
816pub const CXX_LITERAL: Options = unsafe {
817 Options::builder()
818 .nan_string(options::CXX_LITERAL_NAN)
819 .inf_string(options::CXX_LITERAL_INF)
820 .build_unchecked()
821};
822const_assert!(CXX_LITERAL.is_valid());
823
824#[rustfmt::skip]
826pub const C_LITERAL: Options = unsafe {
827 Options::builder()
828 .nan_string(options::C_LITERAL_NAN)
829 .inf_string(options::C_LITERAL_INF)
830 .build_unchecked()
831};
832const_assert!(CXX_LITERAL.is_valid());
833
834#[rustfmt::skip]
836pub const RUBY_LITERAL: Options = unsafe {
837 Options::builder()
838 .nan_string(options::RUBY)
839 .inf_string(options::RUBY)
840 .build_unchecked()
841};
842const_assert!(RUBY_LITERAL.is_valid());
843
844#[rustfmt::skip]
846pub const RUBY_STRING: Options = unsafe {
847 Options::builder()
848 .nan_string(options::RUBY)
849 .inf_string(options::RUBY)
850 .build_unchecked()
851};
852const_assert!(RUBY_STRING.is_valid());
853
854#[rustfmt::skip]
856pub const SWIFT_LITERAL: Options = unsafe {
857 Options::builder()
858 .nan_string(options::SWIFT_LITERAL)
859 .inf_string(options::SWIFT_LITERAL)
860 .build_unchecked()
861};
862const_assert!(SWIFT_LITERAL.is_valid());
863
864#[rustfmt::skip]
866pub const GO_LITERAL: Options = unsafe {
867 Options::builder()
868 .nan_string(options::GO_LITERAL)
869 .inf_string(options::GO_LITERAL)
870 .build_unchecked()
871};
872const_assert!(GO_LITERAL.is_valid());
873
874#[rustfmt::skip]
876pub const HASKELL_LITERAL: Options = unsafe {
877 Options::builder()
878 .nan_string(options::HASKELL_LITERAL)
879 .inf_string(options::HASKELL_LITERAL)
880 .build_unchecked()
881};
882const_assert!(HASKELL_LITERAL.is_valid());
883
884#[rustfmt::skip]
886pub const HASKELL_STRING: Options = unsafe {
887 Options::builder()
888 .inf_string(options::HASKELL_STRING_INF)
889 .build_unchecked()
890};
891const_assert!(HASKELL_STRING.is_valid());
892
893#[rustfmt::skip]
895pub const JAVASCRIPT_LITERAL: Options = unsafe {
896 Options::builder()
897 .inf_string(options::JAVASCRIPT_INF)
898 .build_unchecked()
899};
900const_assert!(JAVASCRIPT_LITERAL.is_valid());
901
902#[rustfmt::skip]
904pub const JAVASCRIPT_STRING: Options = unsafe {
905 Options::builder()
906 .inf_string(options::JAVASCRIPT_INF)
907 .build_unchecked()
908};
909const_assert!(JAVASCRIPT_STRING.is_valid());
910
911#[rustfmt::skip]
913pub const PERL_LITERAL: Options = unsafe {
914 Options::builder()
915 .nan_string(options::PERL_LITERAL)
916 .inf_string(options::PERL_LITERAL)
917 .build_unchecked()
918};
919const_assert!(PERL_LITERAL.is_valid());
920
921#[rustfmt::skip]
923pub const PHP_LITERAL: Options = unsafe {
924 Options::builder()
925 .nan_string(options::PHP_LITERAL_NAN)
926 .inf_string(options::PHP_LITERAL_INF)
927 .build_unchecked()
928};
929const_assert!(PHP_LITERAL.is_valid());
930
931#[rustfmt::skip]
933pub const JAVA_LITERAL: Options = unsafe {
934 Options::builder()
935 .nan_string(options::JAVA_LITERAL)
936 .inf_string(options::JAVA_LITERAL)
937 .build_unchecked()
938};
939const_assert!(JAVA_LITERAL.is_valid());
940
941#[rustfmt::skip]
943pub const JAVA_STRING: Options = unsafe {
944 Options::builder()
945 .inf_string(options::JAVA_STRING_INF)
946 .build_unchecked()
947};
948const_assert!(JAVA_STRING.is_valid());
949
950#[rustfmt::skip]
952pub const R_LITERAL: Options = unsafe {
953 Options::builder()
954 .inf_string(options::R_LITERAL_INF)
955 .build_unchecked()
956};
957const_assert!(R_LITERAL.is_valid());
958
959#[rustfmt::skip]
961pub const KOTLIN_LITERAL: Options = unsafe {
962 Options::builder()
963 .nan_string(options::KOTLIN_LITERAL)
964 .inf_string(options::KOTLIN_LITERAL)
965 .build_unchecked()
966};
967const_assert!(KOTLIN_LITERAL.is_valid());
968
969#[rustfmt::skip]
971pub const KOTLIN_STRING: Options = unsafe {
972 Options::builder()
973 .inf_string(options::KOTLIN_STRING_INF)
974 .build_unchecked()
975};
976const_assert!(KOTLIN_STRING.is_valid());
977
978#[rustfmt::skip]
980pub const JULIA_LITERAL: Options = unsafe {
981 Options::builder()
982 .inf_string(options::JULIA_LITERAL_INF)
983 .build_unchecked()
984};
985const_assert!(JULIA_LITERAL.is_valid());
986
987#[rustfmt::skip]
989pub const CSHARP_LITERAL: Options = unsafe {
990 Options::builder()
991 .nan_string(options::CSHARP_LITERAL)
992 .inf_string(options::CSHARP_LITERAL)
993 .build_unchecked()
994};
995const_assert!(CSHARP_LITERAL.is_valid());
996
997#[rustfmt::skip]
999pub const CSHARP_STRING: Options = unsafe {
1000 Options::builder()
1001 .inf_string(options::CSHARP_STRING_INF)
1002 .build_unchecked()
1003};
1004const_assert!(CSHARP_STRING.is_valid());
1005
1006#[rustfmt::skip]
1008pub const KAWA_LITERAL: Options = unsafe {
1009 Options::builder()
1010 .nan_string(options::KAWA)
1011 .inf_string(options::KAWA)
1012 .build_unchecked()
1013};
1014const_assert!(KAWA_LITERAL.is_valid());
1015
1016#[rustfmt::skip]
1018pub const KAWA_STRING: Options = unsafe {
1019 Options::builder()
1020 .nan_string(options::KAWA)
1021 .inf_string(options::KAWA)
1022 .build_unchecked()
1023};
1024const_assert!(KAWA_STRING.is_valid());
1025
1026#[rustfmt::skip]
1028pub const GAMBITC_LITERAL: Options = unsafe {
1029 Options::builder()
1030 .nan_string(options::GAMBITC)
1031 .inf_string(options::GAMBITC)
1032 .build_unchecked()
1033};
1034const_assert!(GAMBITC_LITERAL.is_valid());
1035
1036#[rustfmt::skip]
1038pub const GAMBITC_STRING: Options = unsafe {
1039 Options::builder()
1040 .nan_string(options::GAMBITC)
1041 .inf_string(options::GAMBITC)
1042 .build_unchecked()
1043};
1044const_assert!(GAMBITC_STRING.is_valid());
1045
1046#[rustfmt::skip]
1048pub const GUILE_LITERAL: Options = unsafe {
1049 Options::builder()
1050 .nan_string(options::GUILE)
1051 .inf_string(options::GUILE)
1052 .build_unchecked()
1053};
1054const_assert!(GUILE_LITERAL.is_valid());
1055
1056#[rustfmt::skip]
1058pub const GUILE_STRING: Options = unsafe {
1059 Options::builder()
1060 .nan_string(options::GUILE)
1061 .inf_string(options::GUILE)
1062 .build_unchecked()
1063};
1064const_assert!(GUILE_STRING.is_valid());
1065
1066#[rustfmt::skip]
1068pub const CLOJURE_LITERAL: Options = unsafe {
1069 Options::builder()
1070 .nan_string(options::CLOJURE_LITERAL)
1071 .inf_string(options::CLOJURE_LITERAL)
1072 .build_unchecked()
1073};
1074const_assert!(CLOJURE_LITERAL.is_valid());
1075
1076#[rustfmt::skip]
1078pub const CLOJURE_STRING: Options = unsafe {
1079 Options::builder()
1080 .inf_string(options::CLOJURE_STRING_INF)
1081 .build_unchecked()
1082};
1083const_assert!(CLOJURE_STRING.is_valid());
1084
1085#[rustfmt::skip]
1087pub const ERLANG_LITERAL: Options = unsafe {
1088 Options::builder()
1089 .nan_string(options::ERLANG_LITERAL_NAN)
1090 .build_unchecked()
1091};
1092const_assert!(ERLANG_LITERAL.is_valid());
1093
1094#[rustfmt::skip]
1096pub const ERLANG_STRING: Options = unsafe {
1097 Options::builder()
1098 .nan_string(options::ERLANG_STRING)
1099 .inf_string(options::ERLANG_STRING)
1100 .build_unchecked()
1101};
1102const_assert!(ERLANG_STRING.is_valid());
1103
1104#[rustfmt::skip]
1106pub const ELM_LITERAL: Options = unsafe {
1107 Options::builder()
1108 .nan_string(options::ELM_LITERAL)
1109 .inf_string(options::ELM_LITERAL)
1110 .build_unchecked()
1111};
1112const_assert!(ELM_LITERAL.is_valid());
1113
1114#[rustfmt::skip]
1116pub const ELM_STRING: Options = unsafe {
1117 Options::builder()
1118 .nan_string(options::ELM_STRING_NAN)
1119 .inf_string(options::ELM_STRING_INF)
1120 .build_unchecked()
1121};
1122const_assert!(ELM_STRING.is_valid());
1123
1124#[rustfmt::skip]
1126pub const SCALA_LITERAL: Options = unsafe {
1127 Options::builder()
1128 .nan_string(options::SCALA_LITERAL)
1129 .inf_string(options::SCALA_LITERAL)
1130 .build_unchecked()
1131};
1132const_assert!(SCALA_LITERAL.is_valid());
1133
1134#[rustfmt::skip]
1136pub const SCALA_STRING: Options = unsafe {
1137 Options::builder()
1138 .inf_string(options::SCALA_STRING_INF)
1139 .build_unchecked()
1140};
1141const_assert!(SCALA_STRING.is_valid());
1142
1143#[rustfmt::skip]
1145pub const ELIXIR_LITERAL: Options = unsafe {
1146 Options::builder()
1147 .nan_string(options::ELIXIR)
1148 .inf_string(options::ELIXIR)
1149 .build_unchecked()
1150};
1151const_assert!(ELIXIR_LITERAL.is_valid());
1152
1153#[rustfmt::skip]
1155pub const ELIXIR_STRING: Options = unsafe {
1156 Options::builder()
1157 .nan_string(options::ELIXIR)
1158 .inf_string(options::ELIXIR)
1159 .build_unchecked()
1160};
1161const_assert!(ELIXIR_STRING.is_valid());
1162
1163#[rustfmt::skip]
1165pub const FORTRAN_LITERAL: Options = unsafe {
1166 Options::builder()
1167 .nan_string(options::FORTRAN_LITERAL)
1168 .inf_string(options::FORTRAN_LITERAL)
1169 .build_unchecked()
1170};
1171const_assert!(FORTRAN_LITERAL.is_valid());
1172
1173#[rustfmt::skip]
1175pub const D_LITERAL: Options = unsafe {
1176 Options::builder()
1177 .nan_string(options::D_LITERAL)
1178 .inf_string(options::D_LITERAL)
1179 .build_unchecked()
1180};
1181const_assert!(D_LITERAL.is_valid());
1182
1183#[rustfmt::skip]
1185pub const COFFEESCRIPT_LITERAL: Options = unsafe {
1186 Options::builder()
1187 .inf_string(options::COFFEESCRIPT_INF)
1188 .build_unchecked()
1189};
1190const_assert!(COFFEESCRIPT_LITERAL.is_valid());
1191
1192#[rustfmt::skip]
1194pub const COFFEESCRIPT_STRING: Options = unsafe {
1195 Options::builder()
1196 .inf_string(options::COFFEESCRIPT_INF)
1197 .build_unchecked()
1198};
1199const_assert!(COFFEESCRIPT_STRING.is_valid());
1200
1201#[rustfmt::skip]
1203pub const COBOL_LITERAL: Options = unsafe {
1204 Options::builder()
1205 .nan_string(options::COBOL)
1206 .inf_string(options::COBOL)
1207 .build_unchecked()
1208};
1209const_assert!(COBOL_LITERAL.is_valid());
1210
1211#[rustfmt::skip]
1213pub const COBOL_STRING: Options = unsafe {
1214 Options::builder()
1215 .nan_string(options::COBOL)
1216 .inf_string(options::COBOL)
1217 .build_unchecked()
1218};
1219const_assert!(COBOL_STRING.is_valid());
1220
1221#[rustfmt::skip]
1223pub const FSHARP_LITERAL: Options = unsafe {
1224 Options::builder()
1225 .nan_string(options::FSHARP_LITERAL_NAN)
1226 .inf_string(options::FSHARP_LITERAL_INF)
1227 .build_unchecked()
1228};
1229const_assert!(FSHARP_LITERAL.is_valid());
1230
1231#[rustfmt::skip]
1233pub const VB_LITERAL: Options = unsafe {
1234 Options::builder()
1235 .nan_string(options::VB_LITERAL)
1236 .inf_string(options::VB_LITERAL)
1237 .build_unchecked()
1238};
1239const_assert!(VB_LITERAL.is_valid());
1240
1241#[rustfmt::skip]
1243pub const VB_STRING: Options = unsafe {
1244 Options::builder()
1245 .inf_string(options::VB_STRING_INF)
1246 .build_unchecked()
1247};
1248const_assert!(VB_STRING.is_valid());
1249
1250#[rustfmt::skip]
1252pub const OCAML_LITERAL: Options = unsafe {
1253 Options::builder()
1254 .nan_string(options::OCAML_LITERAL_NAN)
1255 .inf_string(options::OCAML_LITERAL_INF)
1256 .build_unchecked()
1257};
1258const_assert!(OCAML_LITERAL.is_valid());
1259
1260#[rustfmt::skip]
1262pub const OBJECTIVEC_LITERAL: Options = unsafe {
1263 Options::builder()
1264 .nan_string(options::OBJECTIVEC)
1265 .inf_string(options::OBJECTIVEC)
1266 .build_unchecked()
1267};
1268const_assert!(OBJECTIVEC_LITERAL.is_valid());
1269
1270#[rustfmt::skip]
1272pub const OBJECTIVEC_STRING: Options = unsafe {
1273 Options::builder()
1274 .nan_string(options::OBJECTIVEC)
1275 .inf_string(options::OBJECTIVEC)
1276 .build_unchecked()
1277};
1278const_assert!(OBJECTIVEC_STRING.is_valid());
1279
1280#[rustfmt::skip]
1282pub const REASONML_LITERAL: Options = unsafe {
1283 Options::builder()
1284 .nan_string(options::REASONML_LITERAL_NAN)
1285 .inf_string(options::REASONML_LITERAL_INF)
1286 .build_unchecked()
1287};
1288const_assert!(REASONML_LITERAL.is_valid());
1289
1290#[rustfmt::skip]
1292pub const MATLAB_LITERAL: Options = unsafe {
1293 Options::builder()
1294 .inf_string(options::MATLAB_LITERAL_INF)
1295 .build_unchecked()
1296};
1297const_assert!(MATLAB_LITERAL.is_valid());
1298
1299#[rustfmt::skip]
1301pub const ZIG_LITERAL: Options = unsafe {
1302 Options::builder()
1303 .nan_string(options::ZIG_LITERAL)
1304 .inf_string(options::ZIG_LITERAL)
1305 .build_unchecked()
1306};
1307const_assert!(ZIG_LITERAL.is_valid());
1308
1309#[rustfmt::skip]
1311pub const SAGE_LITERAL: Options = unsafe {
1312 Options::builder()
1313 .inf_string(options::SAGE_LITERAL_INF)
1314 .build_unchecked()
1315};
1316const_assert!(SAGE_LITERAL.is_valid());
1317
1318#[rustfmt::skip]
1320pub const JSON: Options = unsafe {
1321 Options::builder()
1322 .nan_string(options::JSON)
1323 .inf_string(options::JSON)
1324 .build_unchecked()
1325};
1326const_assert!(JSON.is_valid());
1327
1328#[rustfmt::skip]
1330pub const TOML: Options = unsafe {
1331 Options::builder()
1332 .nan_string(options::TOML)
1333 .inf_string(options::TOML)
1334 .build_unchecked()
1335};
1336const_assert!(TOML.is_valid());
1337
1338#[rustfmt::skip]
1340pub const YAML: Options = JSON;
1341
1342#[rustfmt::skip]
1344pub const XML: Options = unsafe {
1345 Options::builder()
1346 .inf_string(options::XML_INF)
1347 .build_unchecked()
1348};
1349const_assert!(XML.is_valid());
1350
1351#[rustfmt::skip]
1353pub const SQLITE: Options = unsafe {
1354 Options::builder()
1355 .nan_string(options::SQLITE)
1356 .inf_string(options::SQLITE)
1357 .build_unchecked()
1358};
1359const_assert!(SQLITE.is_valid());
1360
1361#[rustfmt::skip]
1363pub const POSTGRESQL: Options = unsafe {
1364 Options::builder()
1365 .nan_string(options::POSTGRESQL)
1366 .inf_string(options::POSTGRESQL)
1367 .build_unchecked()
1368};
1369const_assert!(POSTGRESQL.is_valid());
1370
1371#[rustfmt::skip]
1373pub const MYSQL: Options = unsafe {
1374 Options::builder()
1375 .nan_string(options::MYSQL)
1376 .inf_string(options::MYSQL)
1377 .build_unchecked()
1378};
1379const_assert!(MYSQL.is_valid());
1380
1381#[rustfmt::skip]
1383pub const MONGODB: Options = unsafe {
1384 Options::builder()
1385 .inf_string(options::MONGODB_INF)
1386 .build_unchecked()
1387};
1388const_assert!(MONGODB.is_valid());