1#[cfg(any(feature = "write-floats", feature = "write-integers"))]
22use crate::constants::FormattedSize;
23
24#[doc(hidden)]
28#[macro_export]
29macro_rules! write_options_doc {
30 () => {
31 "
32Get an upper bound on the required buffer size.
33
34<div class=\"warning\">
35
36This method is soft-deprecated and meant for internal use.
37You should always use [`buffer_size_const`] so you can get
38the required buffer size at compile time to determine the
39buffer size required.
40
41</div>
42
43[`buffer_size_const`]: Self::buffer_size_const
44
45This is used when custom formatting options, such as significant
46digits specifiers or custom exponent breaks, are used, which
47can lead to more or less significant digits being written than
48expected. If using the default formatting options, then this will
49always be [`FORMATTED_SIZE`][FormattedSize::FORMATTED_SIZE] or
50[`FORMATTED_SIZE_DECIMAL`][FormattedSize::FORMATTED_SIZE_DECIMAL],
51depending on the radix.
52"
53 };
54}
55
56#[cfg(any(feature = "write-floats", feature = "write-integers"))]
58pub trait WriteOptions: Default {
59 fn is_valid(&self) -> bool;
61
62 #[deprecated = "Use `buffer_size_const` instead. Will be removed in 2.0."]
87 fn buffer_size<T: FormattedSize, const FORMAT: u128>(&self) -> usize;
88}
89
90#[cfg(any(feature = "parse-floats", feature = "parse-integers"))]
92pub trait ParseOptions: Default {
93 fn is_valid(&self) -> bool;
95}
96
97macro_rules! literal {
108 ($name:ident, $value:ident $(, $doc:literal)?) => {
109 $(#[doc = $doc])?
110 pub const $name: Option<&[u8]> = $value;
111 };
112 ($name:ident, $value:literal $(, $doc:literal)?) => {
113 $(#[doc = $doc])?
114 pub const $name: Option<&[u8]> = Some($value);
115 };
116}
117
118literal!(RUST_LITERAL, None, "A `Rust` literal number (uses default options).");
119literal!(PYTHON_LITERAL, None, "A `Python` literal number (uses default options).");
121literal!(CXX_LITERAL_NAN, b"NAN", "A `C++` literal NaN (`NAN`).");
123literal!(CXX_LITERAL_INF, b"INFINITY", "A `C++` literal short infinity (`INFINITY`).");
124literal!(CXX_LITERAL_INFINITY, b"INFINITY", "A `C++` literal long infinity (`INFINITY`).");
125literal!(C_LITERAL_NAN, b"NAN", "A `C` literal NaN (`NAN`).");
127literal!(C_LITERAL_INF, b"INFINITY", "A `C` literal short infinity (`INFINITY`).");
128literal!(C_LITERAL_INFINITY, b"INFINITY", "A `C` literal long infinity (`INFINITY`).");
129literal!(RUBY_LITERAL_NAN, b"NaN", "A `Ruby` literal NaN (`NaN`).");
131literal!(RUBY_LITERAL_INF, b"Infinity", "A `Ruby` literal short infinity (`Infinity`).");
132literal!(RUBY_STRING_NONE, None, "A `Ruby` string (uses default options).");
133literal!(SWIFT_LITERAL, None, "A `Swift` literal number (uses default options).");
135literal!(GO_LITERAL, None, "A `Golang` literal number (uses default options).");
137literal!(HASKELL_LITERAL, None, "A `Haskell` literal number (uses default options).");
139literal!(HASKELL_STRING_INF, b"Infinity", "A `Haskell` string short infinity (`Infinity`).");
140literal!(HASKELL_STRING_INFINITY, b"Infinity", "A `Haskell` string long infinity (`Infinity`).");
141literal!(JAVASCRIPT_INF, b"Infinity", "A `JavaScript` string short infinity (`Infinity`).");
142literal!(JAVASCRIPT_INFINITY, b"Infinity", "A `JavaScript` string long infinity (`Infinity`).");
143literal!(PERL_LITERAL, None, "A `Perl` literal literal (uses default options).");
144literal!(PHP_LITERAL_NAN, b"NAN", "A `PHP` literal NaN (`NAN`).");
146literal!(PHP_LITERAL_INF, b"INF", "A `PHP` literal short infinity (`INF`).");
147literal!(PHP_LITERAL_INFINITY, b"INF", "A `PHP` literal long infinity (`INF`).");
148literal!(JAVA_LITERAL, None, "A `Java` literal number (uses default options).");
150literal!(JAVA_STRING_INF, b"Infinity", "A `Java` string short infinity (`Infinity`).");
151literal!(JAVA_STRING_INFINITY, b"Infinity", "A `Java` string long infinity (`Infinity`).");
152literal!(R_LITERAL_INF, b"Inf", "An `R` literal short infinity (`Inf`).");
153literal!(R_LITERAL_INFINITY, b"Inf", "An `R` literal long infinity (`Inf`).");
154literal!(KOTLIN_LITERAL, None, "A `Kotlin` literal number (uses default options).");
156literal!(KOTLIN_STRING_INF, b"Infinity", "A `Kotlin` string short infinity (`Infinity`).");
157literal!(KOTLIN_STRING_INFINITY, b"Infinity", "A `Kotlin` string long infinity (`Infinity`).");
158literal!(JULIA_LITERAL_INF, b"Inf", "A `Julia` string short infinity (`Inf`).");
159literal!(JULIA_LITERAL_INFINITY, b"Inf", "A `Julia` string long infinity (`Inf`).");
160literal!(CSHARP_LITERAL, None, "A `C#` literal number (uses default options).");
162literal!(CSHARP_STRING_INF, b"Infinity", "A `C#` string short infinity (`Infinity`).");
163literal!(CSHARP_STRING_INFINITY, b"Infinity", "A `C#` string long infinity (`Infinity`).");
164literal!(KAWA, None, "A `Kawa` (Lisp) literal number (uses default options).");
165literal!(GAMBITC, None, "A `Gambit-C` (Lisp) literal number (uses default options).");
166literal!(GUILE, None, "A `Guile` (Lisp) literal number (uses default options).");
167literal!(CLOJURE_LITERAL, None, "A `Clojure` (Lisp) literal number (uses default options).");
168literal!(CLOJURE_STRING_INF, b"Infinity", "A `Clojure` string short infinity (`Infinity`).");
169literal!(CLOJURE_STRING_INFINITY, b"Infinity", "A `Clojure` string long infinity (`Infinity`).");
170literal!(ERLANG_LITERAL_NAN, b"nan", "An `Erlang` literal NaN (`nan`).");
171literal!(ERLANG_STRING, None, "An `Erlang` string number (uses default options).");
172literal!(ELM_LITERAL, None, "An `Elm` literal number (uses default options).");
173literal!(ELM_STRING_NAN, None, "An `Elm` strong NaN (uses default options).");
174literal!(ELM_STRING_INF, b"Infinity", "An `Elm` string short infinity (`Infinity`).");
175literal!(ELM_STRING_INFINITY, b"Infinity", "An `Elm` string long infinity (`Infinity`).");
176literal!(SCALA_LITERAL, None, "A `Scala` literal number (uses default options).");
177literal!(SCALA_STRING_INF, b"Infinity", "A `Scala` string short infinity (`Infinity`).");
178literal!(SCALA_STRING_INFINITY, b"Infinity", "A `Scala` string long infinity (`Infinity`).");
179literal!(ELIXIR, None, "An `Elixir` number (uses default options).");
180literal!(FORTRAN_LITERAL, None, "A `FORTRAN` literal number (uses default options).");
181literal!(D_LITERAL, None, "A `D-Lang` literal number (uses default options).");
183literal!(COFFEESCRIPT_INF, b"Infinity", "A `CoffeeScript` string short infinity (`Infinity`).");
185literal!(COFFEESCRIPT_INFINITY, b"Infinity", "A `CoffeeScript` string long infinity (`Infinity`).");
186literal!(COBOL, None, "A `COBOL` literal number (uses default options).");
187literal!(FSHARP_LITERAL_NAN, b"nan", "An `F#` literal NaN (`nan`).");
188literal!(FSHARP_LITERAL_INF, b"infinity", "An `F#` literal short infinity (`infinity`).");
189literal!(FSHARP_LITERAL_INFINITY, b"infinity", "An `F#` literal long infinity (`infinity`).");
190literal!(VB_LITERAL, None, "A `Visual Basic` literal number (uses default options)");
192literal!(VB_STRING_INF, None, "A `Visual Basic` short string infinity (uses default options)");
193literal!(VB_STRING_INFINITY, None, "A `Visual Basic` long string number (uses default options)");
194literal!(OCAML_LITERAL_NAN, b"nan", "An `OCAML` literal NaN (`nan`).");
195literal!(OCAML_LITERAL_INF, b"infinity", "An `OCAML` literal short infinity (`infinity`).");
196literal!(OCAML_LITERAL_INFINITY, b"infinity", "An `OCAML` literal long infinity (`infinity`).");
197literal!(OBJECTIVEC, None, "An `Objective-C` number (uses default options).");
199literal!(REASONML_LITERAL_NAN, b"nan", "A `ReasonML` literal NaN (`nan`).");
200literal!(REASONML_LITERAL_INF, b"infinity", "A `ReasonML` literal short infinity (`infinity`).");
201literal!(
202 REASONML_LITERAL_INFINITY,
203 b"infinity",
204 "A `ReasonML` literal long infinity (`infinity`)."
205);
206literal!(MATLAB_LITERAL_INF, b"inf", "A `MATLAB` literal short infinity (`inf`).");
208literal!(MATLAB_LITERAL_INFINITY, b"Inf", "A `MATLAB` literal long infinity (`Inf`).");
209literal!(ZIG_LITERAL, None, "A `Zig` literal number (uses default options).");
211literal!(SAGE_LITERAL_INF, b"infinity", "A `SageMath` literal short infinity (`infinity`).");
213literal!(SAGE_LITERAL_INFINITY, b"Infinity", "A `SageMath` literal long infinity (`Infinity`).");
214literal!(JSON, None, "A `JSON` number (uses default options).");
216literal!(TOML, None, "A `TOML` number (uses default options).");
217literal!(YAML, None, "A `YAML` number (uses default options).");
218literal!(XML_INF, None, "An `XML` short infinity (uses default options).");
219literal!(XML_INFINITY, None, "An `XML` short infinity (uses default options).");
220literal!(SQLITE, None, "A `SQLite` number (uses default options).");
221literal!(POSTGRESQL, None, "A `PostgreSQL` number (uses default options).");
222literal!(MYSQL, None, "A `MySQL` number (uses default options).");
223literal!(MONGODB_INF, b"Infinity", "A `MongoDB` short infinity (`Infinity`).");
224literal!(MONGODB_INFINITY, b"Infinity", "A `MongoDB` long infinity (`Infinity`).");