use crate::util;
use clap::Parser;
use ironoxide::prelude::{BlockingIronOxide, GroupId, GroupName, UserId};
use itertools::Either;
use std::path::PathBuf;
const EXAMPLES: &str = "EXAMPLES
Revoke access to the provided encrypted file from the provided user and group.
$ ironhide file revoke -u john@example.com -g myGroup path/to/file.iron
Revoke access to the provided encrypted file from the provided users and groups.
$ ironhide file revoke -u john@example.com,mike@example.com -g myGroup1,myGroup2 path/to/file.iron
Revoke access to all of the '.iron' files from 'myGroup'.
$ ironhide file revoke -g myGroup *.iron
";
#[derive(Parser)]
#[clap(after_help = EXAMPLES)]
pub struct Revoke {
#[clap(value_parser = clap::value_parser!(PathBuf), num_args = 1.., required = true)]
files: Vec<PathBuf>,
#[clap(value_parser = clap::value_parser!(PathBuf), short, long)]
keyfile: Option<PathBuf>,
#[clap(value_parser = util::group_identifier_from_string, short, long, use_value_delimiter = true, value_delimiter = ',', required = false)]
groups: Vec<Either<GroupName, GroupId>>,
#[clap(value_parser = util::try_from_email, short, long, use_value_delimiter = true, value_delimiter = ',', required = false)]
users: Vec<UserId>,
}
impl util::GetKeyfile for Revoke {
fn get_keyfile(&self) -> Option<&PathBuf> {
self.keyfile.as_ref()
}
}
pub fn revoke_files(sdk: &BlockingIronOxide, revoke: Revoke) -> Result<(), String> {
let revoke_results = util::execute_permissioning_operation(
&revoke.users,
&revoke.groups,
&revoke.files,
sdk,
util::PermissionOperation::Revoke,
);
let table = util::build_permissioning_result_table(
sdk,
revoke_results,
util::PermissionOperation::Revoke,
);
table.printstd();
Ok(())
}