2018-05-14 04:05:28 +00:00
# ActivityStreams Derive
__derive macros for ActivityStreams__
2019-07-30 22:02:05 +00:00
- [Read the documentation on docs.rs ](https://docs.rs/activitystreams-derive )
- [Find the crate on crates.io ](https://crates.io/crates/activitystreams-derive )
2020-03-10 16:48:54 +00:00
- [Hit me up on Mastodon ](https://asonix.dog/@asonix )
2019-07-30 22:02:05 +00:00
2018-05-14 04:05:28 +00:00
## Usage
Add the required crates to your `Cargo.toml`
```toml
# Cargo.toml
2020-03-13 21:22:08 +00:00
activitystreams = "0.5.0-alpha.0"
2020-03-10 16:48:54 +00:00
serde = { version = "1.0", features = ["derive"] }
2018-05-14 04:05:28 +00:00
```
And then in your project
```rust
2020-03-11 18:37:22 +00:00
// derive macros
use activitystreams::{
properties,
PropRefs,
UnitString
2020-03-10 16:48:54 +00:00
};
2020-03-11 18:37:22 +00:00
// traits
use activitystreams::Object;
// properties
use activitystreams::object::properties::ObjectProperties;
2018-05-14 04:05:28 +00:00
/// Using the UnitString derive macro
///
/// This macro implements Serialize and Deserialize for the given type, making this type
/// represent the string "SomeKind" in JSON.
#[derive(Clone, Debug, Default, UnitString)]
2020-03-13 20:54:29 +00:00
#[unit_string(SomeKind)]
2018-05-14 04:05:28 +00:00
pub struct MyKind;
2020-03-10 16:48:54 +00:00
properties! {
My {
docs [
"Using the properties macro",
"",
"This macro generates getters and setters for the associated fields.",
],
kind {
docs [
"Use the UnitString MyKind to enforce the type of the object by \"SomeKind\"",
"",
"Rename to/from 'type' when serializing/deserializing",
],
2018-05-14 04:05:28 +00:00
2020-03-10 16:48:54 +00:00
types [
MyKind,
],
functional,
required,
rename("type"),
},
2018-05-14 04:05:28 +00:00
2020-03-10 16:48:54 +00:00
required_key {
docs [
"Derive getters and setters for required_key with String type.",
"",
"In the Activity Streams spec, 'functional' means there can only be one item for",
"this key. This means all fields not labeled 'functional' can also be",
"serialized/deserialized as Vec< T > .",
"",
"'required' here means that the field must be present, otherwise, it's"
"represented as an Option< T > ",
],
types [
String,
],
functional,
required,
},
}
}
#[derive(Clone, Default, PropRefs, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "camelCase")]
2020-03-13 20:54:29 +00:00
#[prop_refs(Object)]
2020-03-10 16:48:54 +00:00
pub struct My {
/// Derive AsRef< MyProperties > and AsMut< MyProperties >
#[serde(flatten)]
2020-03-13 20:54:29 +00:00
#[prop_refs]
2020-03-10 16:48:54 +00:00
my_properties: MyProperties,
/// Derive AsRef< ObjectProperties > and AsMut< ObjectProperties >
2018-05-14 04:05:28 +00:00
///
2020-03-11 18:37:22 +00:00
/// as well as the Object trait
2020-03-10 16:48:54 +00:00
#[serde(flatten)]
2020-03-13 20:54:29 +00:00
#[prop_refs]
2020-03-10 16:48:54 +00:00
properties: ObjectProperties,
}
fn main() -> Result< (), Box< dyn std::error::Error > > {
let mut my = My::default();
2020-03-11 18:37:22 +00:00
let mprops: & mut MyProperties = my.as_mut();
mprops.set_required_key("Hello")?;
2020-03-10 16:48:54 +00:00
2020-03-11 18:37:22 +00:00
let mprops: & MyProperties = my.as_ref();
assert_eq!(mprops.get_required_key(), "Hello");
2020-03-10 16:48:54 +00:00
Ok(())
2018-05-14 04:05:28 +00:00
}
```
## Contributing
Feel free to open issues for anything you find an issue with. Please note that any contributed code will be licensed under the GPLv3.
## License
2020-03-10 16:48:54 +00:00
Copyright © 2020 Riley Trautman
2018-05-14 04:05:28 +00:00
2018-05-14 04:22:34 +00:00
ActivityStreams Derive is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
2018-05-14 04:05:28 +00:00
2018-05-14 04:22:34 +00:00
ActivityStreams Derive is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. This file is part of ActivityStreams Derive.
2018-05-14 04:05:28 +00:00
2018-05-14 04:22:34 +00:00
You should have received a copy of the GNU General Public License along with ActivityStreams Derive. If not, see [http://www.gnu.org/licenses/ ](http://www.gnu.org/licenses/ ).