Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Last minute changes #8

Merged
merged 2 commits into from
Mar 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 16 additions & 16 deletions src/ability/arguments.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,24 @@

pub use named::{Named, NamedError};

use crate::{invocation::promise::Resolves, ipld};

Check failure on line 7 in src/ability/arguments.rs

View workflow job for this annotation

GitHub Actions / run-checks (stable)

unused imports: `invocation::promise::Resolves`, `ipld`

Check failure on line 7 in src/ability/arguments.rs

View workflow job for this annotation

GitHub Actions / run-checks (nightly)

unused imports: `invocation::promise::Resolves`, `ipld`
use libipld_core::ipld::Ipld;

Check failure on line 8 in src/ability/arguments.rs

View workflow job for this annotation

GitHub Actions / run-checks (stable)

unused import: `libipld_core::ipld::Ipld`

Check failure on line 8 in src/ability/arguments.rs

View workflow job for this annotation

GitHub Actions / run-checks (nightly)

unused import: `libipld_core::ipld::Ipld`
use std::collections::BTreeMap;

// FIXME move under invoc::promise?
pub type Promised = Resolves<Named<ipld::Promised>>;

impl Promised {
pub fn try_resolve_option(self) -> Option<Named<Ipld>> {
match self.try_resolve() {
Err(_) => None,
Ok(named_promises) => named_promises
.iter()
.try_fold(BTreeMap::new(), |mut map, (k, v)| {
map.insert(k.clone(), Ipld::try_from(v.clone()).ok()?);
Some(map)
})
.map(Named),
}
}
}
// pub type Promised = Resolves<Named<ipld::Promised>>;
//
// impl Promised {
// pub fn try_resolve_option(self) -> Option<Named<Ipld>> {
// match self.try_resolve() {
// Err(_) => None,
// Ok(named_promises) => named_promises
// .iter()
// .try_fold(BTreeMap::new(), |mut map, (k, v)| {
// map.insert(k.clone(), Ipld::try_from(v.clone()).ok()?);
// Some(map)
// })
// .map(Named),
// }
// }
// }
198 changes: 92 additions & 106 deletions src/ability/crud.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,30 +37,28 @@
//! [CRUD]: https://en.wikipedia.org/wiki/Create,_read,_update_and_delete
//! [`Did`]: crate::did::Did

mod any;
mod mutate;
mod parents;
// mod any;
// mod mutate;
// mod parents;

pub mod create;
pub mod destroy;
pub mod error;
// pub mod error;
pub mod read;
pub mod update;

pub use any::Any;
pub use mutate::Mutate;
pub use parents::*;
// pub use any::Any;
// pub use mutate::Mutate;
// pub use parents::*;

use crate::{
ability::{
arguments,
command::ToCommand,
parse::{ParseAbility, ParseAbilityError, ParsePromised},
},
delegation::Delegable,
invocation::promise::Resolvable,
ipld,
proof::{checkable::Checkable, parentful::Parentful, parents::CheckParents, same::CheckSame},
};
use libipld_core::ipld::Ipld;

Expand All @@ -75,14 +73,6 @@ pub enum Ready {
Destroy(destroy::Ready),
}

#[derive(Debug, Clone, PartialEq)]
pub enum Builder {
Create(create::Ready),
Read(read::Ready),
Update(update::Builder),
Destroy(destroy::Ready),
}

#[derive(Debug, Clone, PartialEq)]
pub enum Promised {
Create(create::Promised),
Expand Down Expand Up @@ -134,43 +124,39 @@ impl ParsePromised for Promised {
}
}

impl Delegable for Ready {
type Builder = Builder;
}

impl ParseAbility for Builder {
impl ParseAbility for Ready {
type ArgsErr = ();

fn try_parse(
cmd: &str,
args: arguments::Named<Ipld>,
) -> Result<Self, ParseAbilityError<Self::ArgsErr>> {
match create::Ready::try_parse(cmd, args.clone()) {
Ok(create) => return Ok(Builder::Create(create)),
Ok(create) => return Ok(Ready::Create(create)),
Err(ParseAbilityError::InvalidArgs(_)) => {
return Err(ParseAbilityError::InvalidArgs(()));
}
Err(ParseAbilityError::UnknownCommand(_)) => (),
}

match read::Ready::try_parse(cmd, args.clone()) {
Ok(read) => return Ok(Builder::Read(read)),
Ok(read) => return Ok(Ready::Read(read)),
Err(ParseAbilityError::InvalidArgs(_)) => {
return Err(ParseAbilityError::InvalidArgs(()));
}
Err(ParseAbilityError::UnknownCommand(_)) => (),
}

match update::Builder::try_parse(cmd, args.clone()) {
Ok(update) => return Ok(Builder::Update(update)),
match update::Ready::try_parse(cmd, args.clone()) {
Ok(update) => return Ok(Ready::Update(update)),
Err(ParseAbilityError::InvalidArgs(_)) => {
return Err(ParseAbilityError::InvalidArgs(()));
}
Err(ParseAbilityError::UnknownCommand(_)) => (),
}

match destroy::Ready::try_parse(cmd, args) {
Ok(destroy) => return Ok(Builder::Destroy(destroy)),
Ok(destroy) => return Ok(Ready::Destroy(destroy)),
Err(ParseAbilityError::InvalidArgs(_)) => {
return Err(ParseAbilityError::InvalidArgs(()));
}
Expand All @@ -180,10 +166,10 @@ impl ParseAbility for Builder {
Err(ParseAbilityError::UnknownCommand(cmd.into()))
}
}

impl Checkable for Builder {
type Hierarchy = Parentful<Builder>;
}
//
// impl Checkable for Builder {
// type Hierarchy = Parentful<Builder>;
// }

impl ToCommand for Ready {
fn to_command(&self) -> String {
Expand All @@ -207,44 +193,44 @@ impl ToCommand for Promised {
}
}

impl ToCommand for Builder {
fn to_command(&self) -> String {
match self {
Builder::Create(create) => create.to_command(),
Builder::Read(read) => read.to_command(),
Builder::Update(update) => update.to_command(),
Builder::Destroy(destroy) => destroy.to_command(),
}
}
}

impl CheckParents for Builder {
type Parents = MutableParents;
type ParentError = (); // FIXME

fn check_parent(&self, parents: &MutableParents) -> Result<(), Self::ParentError> {
match self {
Builder::Create(create) => create.check_parent(parents.into()).map_err(|_| ()),
Builder::Update(update) => update.check_parent(parents.into()).map_err(|_| ()),
Builder::Destroy(destroy) => destroy.check_parent(parents.into()).map_err(|_| ()),
Builder::Read(read) => match parents {
MutableParents::Any(crud_any) => read.check_parent(crud_any).map_err(|_| ()),
_ => Err(()),
},
}
}
}

impl From<Builder> for arguments::Named<Ipld> {
fn from(builder: Builder) -> Self {
match builder {
Builder::Create(create) => create.into(),
Builder::Read(read) => read.into(),
Builder::Update(update) => update.into(),
Builder::Destroy(destroy) => destroy.into(),
}
}
}
// impl ToCommand for Builder {
// fn to_command(&self) -> String {
// match self {
// Builder::Create(create) => create.to_command(),
// Builder::Read(read) => read.to_command(),
// Builder::Update(update) => update.to_command(),
// Builder::Destroy(destroy) => destroy.to_command(),
// }
// }
// }
//
// impl CheckParents for Builder {
// type Parents = MutableParents;
// type ParentError = (); // FIXME
//
// fn check_parent(&self, parents: &MutableParents) -> Result<(), Self::ParentError> {
// match self {
// Builder::Create(create) => create.check_parent(parents.into()).map_err(|_| ()),
// Builder::Update(update) => update.check_parent(parents.into()).map_err(|_| ()),
// Builder::Destroy(destroy) => destroy.check_parent(parents.into()).map_err(|_| ()),
// Builder::Read(read) => match parents {
// MutableParents::Any(crud_any) => read.check_parent(crud_any).map_err(|_| ()),
// _ => Err(()),
// },
// }
// }
// }
//
// impl From<Builder> for arguments::Named<Ipld> {
// fn from(builder: Builder) -> Self {
// match builder {
// Builder::Create(create) => create.into(),
// Builder::Read(read) => read.into(),
// Builder::Update(update) => update.into(),
// Builder::Destroy(destroy) => destroy.into(),
// }
// }
// }

// impl From<Promised> for arguments::Named<Ipld> {
// fn from(promised: Promised) -> Self {
Expand All @@ -257,43 +243,43 @@ impl From<Builder> for arguments::Named<Ipld> {
// }
// }

impl From<Ready> for Builder {
fn from(ready: Ready) -> Self {
match ready {
Ready::Create(create) => Builder::Create(create.into()),
Ready::Read(read) => Builder::Read(read.into()),
Ready::Update(update) => Builder::Update(update.into()),
Ready::Destroy(destroy) => Builder::Destroy(destroy.into()),
}
}
}

impl TryFrom<Builder> for Ready {
type Error = (); // FIXME

fn try_from(builder: Builder) -> Result<Self, Self::Error> {
match builder {
Builder::Create(create) => create.try_into().map(Ready::Create).map_err(|_| ()),
Builder::Read(read) => read.try_into().map(Ready::Read).map_err(|_| ()),
Builder::Update(update) => update.try_into().map(Ready::Update).map_err(|_| ()),
Builder::Destroy(destroy) => destroy.try_into().map(Ready::Destroy).map_err(|_| ()),
}
}
}

impl CheckSame for Builder {
type Error = ();

fn check_same(&self, other: &Self) -> Result<(), Self::Error> {
match (self, other) {
(Builder::Create(a), Builder::Create(b)) => a.check_same(b),
(Builder::Read(a), Builder::Read(b)) => a.check_same(b),
(Builder::Update(a), Builder::Update(b)) => a.check_same(b),
(Builder::Destroy(a), Builder::Destroy(b)) => a.check_same(b),
_ => Err(()),
}
}
}
// impl From<Ready> for Builder {
// fn from(ready: Ready) -> Self {
// match ready {
// Ready::Create(create) => Builder::Create(create.into()),
// Ready::Read(read) => Builder::Read(read.into()),
// Ready::Update(update) => Builder::Update(update.into()),
// Ready::Destroy(destroy) => Builder::Destroy(destroy.into()),
// }
// }
// }
//
// impl TryFrom<Builder> for Ready {
// type Error = (); // FIXME
//
// fn try_from(builder: Builder) -> Result<Self, Self::Error> {
// match builder {
// Builder::Create(create) => create.try_into().map(Ready::Create).map_err(|_| ()),
// Builder::Read(read) => read.try_into().map(Ready::Read).map_err(|_| ()),
// Builder::Update(update) => update.try_into().map(Ready::Update).map_err(|_| ()),
// Builder::Destroy(destroy) => destroy.try_into().map(Ready::Destroy).map_err(|_| ()),
// }
// }
// }
//
// impl CheckSame for Builder {
// type Error = ();
//
// fn check_same(&self, other: &Self) -> Result<(), Self::Error> {
// match (self, other) {
// (Builder::Create(a), Builder::Create(b)) => a.check_same(b),
// (Builder::Read(a), Builder::Read(b)) => a.check_same(b),
// (Builder::Update(a), Builder::Update(b)) => a.check_same(b),
// (Builder::Destroy(a), Builder::Destroy(b)) => a.check_same(b),
// _ => Err(()),
// }
// }
// }

impl Resolvable for Ready {
type Promised = Promised;
Expand Down
Loading
Loading