mirror of
https://git.asonix.dog/asonix/activitystreams.git
synced 2024-11-25 13:21:00 +00:00
Expose Either type
This commit is contained in:
parent
f3d394d5d6
commit
b7f178f2b6
11 changed files with 52 additions and 15 deletions
|
@ -1,5 +1,8 @@
|
||||||
# Unreleased
|
# Unreleased
|
||||||
|
|
||||||
|
# 0.7.0-alpha.18
|
||||||
|
- expose `Either` type publicly
|
||||||
|
|
||||||
# 0.7.0-alpha.17
|
# 0.7.0-alpha.17
|
||||||
- add `XsdBoolean` for `xsd:boolean` serde compatibility
|
- add `XsdBoolean` for `xsd:boolean` serde compatibility
|
||||||
- add `closed` field for `Question` (range Object | Link | xsd:datetime | xsd:boolean), and related
|
- add `closed` field for `Question` (range Object | Link | xsd:datetime | xsd:boolean), and related
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
[package]
|
[package]
|
||||||
name = "activitystreams"
|
name = "activitystreams"
|
||||||
description = "A set of core types and traits for activitystreams data"
|
description = "A set of core types and traits for activitystreams data"
|
||||||
version = "0.7.0-alpha.17"
|
version = "0.7.0-alpha.18"
|
||||||
license = "GPL-3.0"
|
license = "GPL-3.0"
|
||||||
authors = ["asonix <asonix@asonix.dog>"]
|
authors = ["asonix <asonix@asonix.dog>"]
|
||||||
repository = "https://git.asonix.dog/Aardwolf/activitystreams"
|
repository = "https://git.asonix.dog/Aardwolf/activitystreams"
|
||||||
|
|
|
@ -25,11 +25,10 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
base::{AnyBase, AsBase, Base, Extends},
|
base::{AnyBase, AsBase, Base, Extends},
|
||||||
checked::CheckError,
|
checked::CheckError,
|
||||||
either::Either,
|
|
||||||
markers,
|
markers,
|
||||||
object::{ApObject, AsObject, Object},
|
object::{ApObject, AsObject, Object},
|
||||||
prelude::BaseExt,
|
prelude::BaseExt,
|
||||||
primitives::{OneOrMany, XsdBoolean, XsdDateTime},
|
primitives::{Either, OneOrMany, XsdBoolean, XsdDateTime},
|
||||||
unparsed::{Unparsed, UnparsedMut, UnparsedMutExt},
|
unparsed::{Unparsed, UnparsedMut, UnparsedMutExt},
|
||||||
};
|
};
|
||||||
use iri_string::types::IriString;
|
use iri_string::types::IriString;
|
||||||
|
@ -1437,7 +1436,7 @@ pub trait QuestionExt: AsQuestion {
|
||||||
self.question_ref().closed.as_ref().map(|either| {
|
self.question_ref().closed.as_ref().map(|either| {
|
||||||
either
|
either
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|l| l, |r| r.as_ref().map(|l| *l.as_datetime(), |r| r.0))
|
.map_right(|r| r.as_ref().map_left(|l| *l.as_datetime()).map_right(|r| r.0))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1576,7 +1575,7 @@ pub trait QuestionExt: AsQuestion {
|
||||||
self.question_mut()
|
self.question_mut()
|
||||||
.closed
|
.closed
|
||||||
.take()
|
.take()
|
||||||
.map(|either| either.map(|l| l, |r| r.map(|date| date.into(), |b| b.into())))
|
.map(|either| either.map_right(|r| r.map(|date| date.into(), |b| b.into())))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Remove the closed field from the current activity
|
/// Remove the closed field from the current activity
|
||||||
|
|
|
@ -29,9 +29,8 @@
|
||||||
//! ```
|
//! ```
|
||||||
use crate::{
|
use crate::{
|
||||||
checked::{check, CheckError},
|
checked::{check, CheckError},
|
||||||
either::Either,
|
|
||||||
markers,
|
markers,
|
||||||
primitives::{AnyString, MimeMediaType, OneOrMany},
|
primitives::{AnyString, Either, MimeMediaType, OneOrMany},
|
||||||
unparsed::{Unparsed, UnparsedMut},
|
unparsed::{Unparsed, UnparsedMut},
|
||||||
};
|
};
|
||||||
use iri_string::types::{IriStr, IriString};
|
use iri_string::types::{IriStr, IriString};
|
||||||
|
|
|
@ -300,7 +300,6 @@ pub mod actor;
|
||||||
pub mod base;
|
pub mod base;
|
||||||
pub mod checked;
|
pub mod checked;
|
||||||
pub mod collection;
|
pub mod collection;
|
||||||
mod either;
|
|
||||||
pub mod link;
|
pub mod link;
|
||||||
mod macros;
|
mod macros;
|
||||||
pub mod markers;
|
pub mod markers;
|
||||||
|
|
|
@ -1,7 +1,4 @@
|
||||||
use crate::{
|
use crate::primitives::{Either, OneOrMany, RdfLangString};
|
||||||
either::Either,
|
|
||||||
primitives::{OneOrMany, RdfLangString},
|
|
||||||
};
|
|
||||||
|
|
||||||
/// A type representing any kind of string
|
/// A type representing any kind of string
|
||||||
///
|
///
|
||||||
|
|
|
@ -2,12 +2,24 @@
|
||||||
Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd, serde::Deserialize, serde::Serialize,
|
Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd, serde::Deserialize, serde::Serialize,
|
||||||
)]
|
)]
|
||||||
#[serde(untagged)]
|
#[serde(untagged)]
|
||||||
|
/// Represent either of two types
|
||||||
pub enum Either<L, R> {
|
pub enum Either<L, R> {
|
||||||
Left(L),
|
Left(L),
|
||||||
Right(R),
|
Right(R),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<T> Either<T, T> {
|
||||||
|
/// Extract the inner type when Left and Right are the same
|
||||||
|
pub fn into_inner(self) -> T {
|
||||||
|
match self {
|
||||||
|
Self::Left(t) => t,
|
||||||
|
Self::Right(t) => t,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<L, R> Either<L, R> {
|
impl<L, R> Either<L, R> {
|
||||||
|
/// Try getting just the left
|
||||||
pub fn left(self) -> Option<L> {
|
pub fn left(self) -> Option<L> {
|
||||||
if let Either::Left(l) = self {
|
if let Either::Left(l) = self {
|
||||||
Some(l)
|
Some(l)
|
||||||
|
@ -16,6 +28,7 @@ impl<L, R> Either<L, R> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Try getting just the right
|
||||||
pub fn right(self) -> Option<R> {
|
pub fn right(self) -> Option<R> {
|
||||||
if let Either::Right(r) = self {
|
if let Either::Right(r) = self {
|
||||||
Some(r)
|
Some(r)
|
||||||
|
@ -24,6 +37,7 @@ impl<L, R> Either<L, R> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Borrow the Left and Right
|
||||||
pub fn as_ref(&self) -> Either<&L, &R> {
|
pub fn as_ref(&self) -> Either<&L, &R> {
|
||||||
match self {
|
match self {
|
||||||
Either::Left(ref l) => Either::Left(l),
|
Either::Left(ref l) => Either::Left(l),
|
||||||
|
@ -31,6 +45,7 @@ impl<L, R> Either<L, R> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Mutably borrow the Left and Right
|
||||||
pub fn as_mut(&mut self) -> Either<&mut L, &mut R> {
|
pub fn as_mut(&mut self) -> Either<&mut L, &mut R> {
|
||||||
match self {
|
match self {
|
||||||
Either::Left(ref mut l) => Either::Left(l),
|
Either::Left(ref mut l) => Either::Left(l),
|
||||||
|
@ -38,6 +53,7 @@ impl<L, R> Either<L, R> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Map over the Left and Right values
|
||||||
pub fn map<F1, F2, L2, R2>(self, f1: F1, f2: F2) -> Either<L2, R2>
|
pub fn map<F1, F2, L2, R2>(self, f1: F1, f2: F2) -> Either<L2, R2>
|
||||||
where
|
where
|
||||||
F1: Fn(L) -> L2,
|
F1: Fn(L) -> L2,
|
||||||
|
@ -48,4 +64,26 @@ impl<L, R> Either<L, R> {
|
||||||
Either::Right(r) => Either::Right((f2)(r)),
|
Either::Right(r) => Either::Right((f2)(r)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Map just the left value
|
||||||
|
pub fn map_left<F, L2>(self, f: F) -> Either<L2, R>
|
||||||
|
where
|
||||||
|
F: Fn(L) -> L2,
|
||||||
|
{
|
||||||
|
match self {
|
||||||
|
Either::Left(l) => Either::Left((f)(l)),
|
||||||
|
Either::Right(r) => Either::Right(r),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Map just the right value
|
||||||
|
pub fn map_right<F, R2>(self, f: F) -> Either<L, R2>
|
||||||
|
where
|
||||||
|
F: Fn(R) -> R2,
|
||||||
|
{
|
||||||
|
match self {
|
||||||
|
Either::Left(l) => Either::Left(l),
|
||||||
|
Either::Right(r) => Either::Right((f)(r)),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -14,6 +14,7 @@
|
||||||
//! ```
|
//! ```
|
||||||
|
|
||||||
mod any_string;
|
mod any_string;
|
||||||
|
mod either;
|
||||||
mod one_or_many;
|
mod one_or_many;
|
||||||
mod rdf_lang_string;
|
mod rdf_lang_string;
|
||||||
mod serde_parse;
|
mod serde_parse;
|
||||||
|
@ -24,6 +25,7 @@ mod xsd_duration;
|
||||||
|
|
||||||
pub use self::{
|
pub use self::{
|
||||||
any_string::AnyString,
|
any_string::AnyString,
|
||||||
|
either::Either,
|
||||||
one_or_many::OneOrMany,
|
one_or_many::OneOrMany,
|
||||||
rdf_lang_string::RdfLangString,
|
rdf_lang_string::RdfLangString,
|
||||||
unit::Unit,
|
unit::Unit,
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::either::Either;
|
use crate::primitives::Either;
|
||||||
|
|
||||||
/// A type representing at least one value
|
/// A type representing at least one value
|
||||||
///
|
///
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::either::Either;
|
use crate::primitives::Either;
|
||||||
|
|
||||||
/// A type representing units of length
|
/// A type representing units of length
|
||||||
///
|
///
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::either::Either;
|
use crate::primitives::Either;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::ops::{Deref, DerefMut};
|
use std::ops::{Deref, DerefMut};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue