Commit graph xmpp-rs/xso/src/text.rs
Author SHA1 Message Date
Jonas Schäfer
67e7e9da15 xso: improve documentation around text traits for third-party types
The previous wording was a bit ominous in places ("Because of the
unfortunate situation as described in `FromXmlText`"). This should be
clearer and provides hopefully clearer instructions.
2025-04-27 14:08:38 +02:00
Maxime “pep” Buquet
5b62672541 xso: clippy run
Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
2025-04-08 12:47:56 +02:00
Maxime “pep” Buquet
ab7e6de3e1 xso: Add support for serde_json::Value
Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
2025-04-07 18:35:43 +00:00
Emmanuel Gil Peyrot
356ad0d46e xso: Fix all failing clippy tests
They are all sensible to me.

skip-changelog: Internal changes.
2025-02-12 19:11:32 +00:00
Jonas Schäfer
4c9a271842 xso: remove incorrect/obsolete comment 2025-01-25 12:24:03 +01:00
Jonas Schäfer
69787569c9 xso: implement TextCodec<_> on all T: base64::engine::Engine
The `xso::text::Base64` struct remains as a shorthand (because frankly,
I find the const names in the base64 crate very unwieldly), but you can
now use any of the base64 engines as codec.
2025-01-25 12:22:05 +01:00
1c1b960265 xso: Add std feature ; default-features compiles in no-std 2024-12-19 20:38:28 +01:00
8c033a3fa0 xso: Implement FromXmlText and AsXmlText for NodePart,DomainPart,ResourcePart 2024-12-18 15:43:09 +00:00
Alvaro Parker
2ff89a9e42 fix typos 2024-09-16 18:29:44 -03:00
2103ef0191 Remove manual doc_cfg feature because we have doc_auto_cfg 2024-08-05 11:14:41 +02:00
Emmanuel Gil Peyrot
f318dd460d xso: Use core instead of std wherever possible 2024-08-04 12:41:17 +00:00
Emmanuel Gil Peyrot
7f5b6fec7f xso: Allow any T: FromXmlText + AsXmlText in EmptyAsNone
This text codec was previously implemented only for Option<String>, this
extends it to all types implementing those two traits, such as numbers
or JIDs.
2024-08-03 13:43:44 +02:00
Jonas Schäfer
271c31c9d4 xso: use values instead of types for text codecs
This allows stateful or configurable codecs without having to express
all configuration in the type name itself. For example, we could have a
Base64 type with configurable Base64 engines without having to duplicate
the Base64 type itself.

(Note that the different engines in the Base64 crate are values, not
types.)
2024-08-03 12:14:26 +02:00
Jonas Schäfer
fce846ae3d xso: refactor Base64 text codec
This introduces support for `Cow<'_, [u8]>` (which is not needed
currently, but still good to have) and generalizes the `Option<T>`
implementation so that it doesn't have to be copied for every other type
supported to be Base64'd (we may add support for `bytes::Bytes` at some
point, for instance).
2024-07-25 22:22:55 +02:00
Jonas Schäfer
bf46248eeb xso: implement FromXmlText/AsXmlText for char 2024-07-25 22:22:55 +02:00
Jonas Schäfer
fe61a25cfd xso: improve macro for FromXmlText/AsXmlText
Now it's not limited to a single feature gate per type (or even just
feature gates: it should now also be possible to add constraints
based on OS, for example) anymore.
2024-07-25 22:22:55 +02:00
Jonas Schäfer
204c82e6b0 xso: add more doc comments throughout 2024-07-25 22:22:55 +02:00
Emmanuel Gil Peyrot
2b333ce579 xso: Add an EmptyAsError text codec
As its name implies, this codec emits an error when the parsed string is
empty.
2024-07-25 18:42:18 +02:00
Emmanuel Gil Peyrot
f0b51decea xso: Import the ColonSeparatedHex text codec from xmpp-parsers
This codec converts from a colon-separated case-insensitive hexadecimal
string into a Vec of bytes, and back to a lowercase colon-separated
hexadecimal string.  Each byte must be separated by exactly one colon.
2024-07-25 18:42:18 +02:00
Emmanuel Gil Peyrot
16204a1092 xso: Import the FixedHex text codec from xmpp-parsers
This codec converts from a fixed-size case-insensitive hexadecimal
string into an array of bytes, and back to a lowercase hexadecimal
string.
2024-07-25 18:42:18 +02:00
Jonas Schäfer
7bc7e7a684 xso: remove remnants of IntoXml 2024-07-24 16:05:06 +02:00
Jonas Schäfer
ccf38cdf9b Port everything over to AsXml 2024-07-24 16:05:06 +02:00
Jonas Schäfer
4910b01244 xso: add text conversion traits for AsXml 2024-07-24 16:05:06 +02:00
Emmanuel Gil Peyrot
b18385cfff xso: Fix all clippy warnings 2024-07-03 16:28:11 +02:00
Jonas Schäfer
7c7f6d1f23 xso: add support for base64 text codec 2024-07-02 06:56:30 +02:00
Jonas Schäfer
c83ff286e0 xso-proc: add support for text codecs
Text codecs allow to customize the conversion of data from/to XML,
in particular in two scenarios:

1. When the type for which the behaviour is to be defined comes from a
   foreign crate, preventing the implementation of
   FromXmlText/IntoXmlText.

2. When there is not one obvious, or more than one sensible, way to
   convert a value to XML text and back.
2024-07-02 06:56:30 +02:00
Jonas Schäfer
1f679c3af7 xso: add traits for XML text <-> value conversion
The traits have undergone a couple iterations and this is what we end up
with. The core issue which makes this entire thing ugly is the
Orphan Rule, preventing some trait implementations relating to types
which haven't been defined in this crate.

In an ideal world, we would implement FromXmlText and IntoXmlText for
all types implementing FromStr and/or fmt::Display.

This comes with two severe issues:

1. Downstream crates cannot chose to have different
   parsing/serialisation behaviour for "normal" text vs. xml.

2. We ourselves cannot define a behaviour for `Option<T>`. `Option<T>`
   does not implement `FromStr` (nor `Display`), but the standard
   library *could* do that at some point, and thus Rust doesn't let us
   implement e.g. `FromXmlText for Option<T> where T: FromXmlText`,
   if we also implement it on `T: FromStr`.

The second one hurts particularly once we get to optional attributes:
For these, we need to "detect" that the type is in fact `Option<T>`,
because we then need to invoke `FromXmlText` on `T` instead of
`Option<T>`. Unfortunately, we cannot do that: macros operate on token
streams and we have no type information available.

We can of course match on the name `Option`, but that breaks down when
users re-import `Option` under a different name. Even just enumerating
all the possible correct ways of using `Option` from the standard
library (there are more than three) would be a nuisance at best.

Hence, we need *another* trait or at least a specialized implementation
of `FromXmlText for Option<T>`, and we cannot do that if we blanket-impl
`FromXmlText` on `T: FromStr`.

That makes the traits what they are, and introduces the requirement that
we know about any upstream crate which anyone might want to parse from
or to XML. This sucks a lot, but that's the state of the world. We are
late to the party, and we cannot expect everyone to do the same they
have done for `serde` (many crates have a `feature = "serde"` which then
provides Serialize/Deserialize trait impls for their types).
2024-06-30 13:01:36 +02:00