icu_provider::marker

Trait DataMarker

Source
pub trait DataMarker: 'static {
    type Yokeable: for<'a> Yokeable<'a>;
}
Expand description

Trait marker for data structs. All types delivered by the data provider must be associated with something implementing this trait.

Structs implementing this trait are normally generated with the data_struct macro.

By convention, the non-standard Marker suffix is used by types implementing DataMarker.

In addition to a marker type implementing DataMarker, the following impls must also be present for the data struct:

  • impl<'a> Yokeable<'a> (required)
  • impl ZeroFrom<Self>

Also see KeyedDataMarker.

Note: DataMarkers are quasi-const-generic compile-time objects, and as such are expected to be unit structs. As this is not something that can be enforced by the type system, we currently only have a 'static bound on them (which is needed by a lot of our code).

§Examples

Manually implementing DataMarker for a custom type:

use icu_provider::prelude::*;
use std::borrow::Cow;

#[derive(yoke::Yokeable, zerofrom::ZeroFrom)]
struct MyDataStruct<'data> {
    message: Cow<'data, str>,
}

struct MyDataStructMarker;

impl DataMarker for MyDataStructMarker {
    type Yokeable = MyDataStruct<'static>;
}

// We can now use MyDataStruct with DataProvider:
let s = MyDataStruct {
    message: Cow::Owned("Hello World".into()),
};
let payload = DataPayload::<MyDataStructMarker>::from_owned(s);
assert_eq!(payload.get().message, "Hello World");

Required Associated Types§

Source

type Yokeable: for<'a> Yokeable<'a>

A type that implements Yokeable. This should typically be the 'static version of a data struct.

Implementors§