Commit graph

27 commits

Author SHA1 Message Date
d4bbeb2c6c minidom: Add todo in Prefixes
Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
2020-04-21 22:23:36 +02:00
fa8b9ed199 minidom: rustfmt
Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
2020-04-21 22:23:36 +02:00
3d71e37e0c minidom: Ensure there is no colon in name when creating element
Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
2020-04-21 22:23:36 +02:00
937e2380b9 minidom: Make ElementBuilder::prefix fail on adding duplicate prefix
Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
2020-04-21 22:23:36 +02:00
770dff7cb0 minidom: Don't borrow prefix in Prefixes.get
Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
2020-04-21 22:23:36 +02:00
1f2d7aa99d minidom: Rework Prefixes internal structure
Change the mapping in Prefixes to Prefix -> Namespace instead of
Namespace -> Prefix. This allows us to not have duplicate prefixes
anymore, but requires us to store the prefix on Element. This prefix is
only taken as a hint anyway and used only when coming from the reader.

This commits also partially removes the possibility to add prefixes
when creating an Element via `Element::new`, `Element::builder` or
`Element::bare`. Proper errors should be added in the following commits.

Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
2020-04-21 22:23:36 +02:00
429949102d minidom: remove unused Rc
Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
2020-04-21 22:23:36 +02:00
40b92d64e2 minidom: clarify meaning of Element.name (being the local name)
Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
2020-04-21 22:23:36 +02:00
171e7f1f34 minidom: ensure prefix is extracted out of provided name when creating Element
I would have liked to handle all of this in `Element::new` only, but I
also have to do it in `Element::builder` unfortunately because then
element builder then pushes prefixes it gathered itself.

Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
2020-04-21 22:23:36 +02:00
f151306fbe minidom: forcing a namespace on Element. Stop requiring prefixes.
Below is what I think I did.

A few changes:
- Change prefixes to be something less important in the API.
- Rework the Element struct to force a namespace. In XMPP everything is
  namespaced.
- Remove parent ref on what was previously NamespaceSet and is now
  Prefixes.

More specifically this means `Element::new` has changed to require
`Element`'s new new properties as parameters. `Element::builder` and
`Element::bare` now require a namespace unconditionally.
`Element::prefix` has been removed.

This new API is based on the fact that prefixes are non-essential
(really just an implementation detail) and shouldn't be visible to the
user. It is possible nonetheless to set custom prefixes for
compatibility reasons with `ElementBuilder::prefix`. **A prefix is
firstly mapped to a namespace, and then attached to an element**, there
cannot be a prefix without a namespace.

Prefix inheritance is used if possible but for the case with no
prefix ("xmlns") to be reused, we only check custom prefixes declared on
the tag itself and not ascendants. If it's already used then we generate
prefixes (ns0, ns1, ..) checking on what has been declared on all
ascendants (plus of course those already set on the current tag).

Example API:

```rust
let mut elem = ElementBuilder("stream", "http://etherx.jabber.org/streams")
  .prefix(Some(String::from("stream")), "http://etherx.jabber.org/streams)
  .prefix(None, "jabber:client")
  .attr(..)
  .build();

assert_eq!(elem.ns(), String::from("http://etherx.jabber.org/streams"));
```

See also the few tests added in src/tests.

TODO: Fix inconsistencies wrt. "prefix:name" format provided as a name
when creating an Element with `Element::new` or `Element::bare`.
`Element::builder` already handles this as it should, splitting name and
prefix.
TODO: Change `Element::name` method to `Element::local_name` to make it
more explicit.

Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
2020-04-21 22:23:36 +02:00
20b224855c minidom: Remove NSChoice::None
Although it is still possible to create such elements, this is not a a
case that should happen in XMPP. Changing to API to prevent the creation
of these elements is next on the list.

Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
2020-03-27 18:32:57 +00:00
5e7701f334
minidom: Remove remaining Comment bits in node
They were hidden behind the flag and not showing up in tests.

Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
2020-03-26 23:21:50 +01:00
015d0007fc
minidom: Remove comments support. Forbid them as per XMPP RFC.
Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
2020-03-26 20:50:30 +01:00
Emmanuel Gil Peyrot
944c4a0815 minidom: quick-xml::Error now implements Error without failure, so use it
Thanks pep.!
2020-02-28 01:28:54 +01:00
9511247d2f minidom: add license headers
Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
2020-02-15 00:52:26 +01:00
e62e870ef0 minidom: strictly compare whitespace in Element's PartialEq impl
Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
2019-12-08 11:03:01 +00:00
c9e6e3d095 minidom: Handle Node::Comment in PartialEq
Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
2019-12-08 11:03:01 +00:00
1c5551a917
minidom: Implement PartialEq manually for Node and Element
Move the NamespaceAwareCompare implementation from xmpp-parsers as Node
and Element's PartialEq implementation. Thanks Astro!

It's a lot more useful in tests to use `assert_eq!` than `assert!`, so
we get both items compared (left and right) instead of a "it failed."
message.

This "breaks" comparison for these two structs in the sense that it is
not strict object comparison anymore but it ensures that namespaces are
all present in the compared objects.

Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
2019-11-29 16:02:23 +01:00
Xidorn Quan
219b0bbe87 minidom: Use NSChoice in more places 2019-11-26 22:47:35 +11:00
141d11ad38
minidom: Don't prepend xml prelude in writer. Add new API
Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
2019-11-10 01:01:42 +01:00
8042d6ea23
minidom: Move compare_ns out of NamespaceSet into NSChoice
Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
2019-11-09 12:45:31 +01:00
28faee8408
minidom: rustfmt latest commit
Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
2019-11-09 01:33:46 +01:00
362ceae922
minidom: Add NSChoice enum to extent element.is and .has_ns API
Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
2019-11-09 01:26:48 +01:00
276dc4fcb2
minidom: Fix code style
Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
2019-11-06 03:51:58 +01:00
Emmanuel Gil Peyrot
877d5c21da minidom: Add a blanket impl for From<Into<Element>> for Node. 2019-11-03 18:49:11 +01:00
a104ebc3f6
Rustfmt pass, and rustfmt --check in CI"
Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
2019-10-23 01:36:02 +02:00
57b2c6a135
Prepare for merge: Move all minidom-rs files into minidom-rs/
Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
2019-10-18 14:27:53 +02:00