Skip to content

Commit

Permalink
Move Cors data structure into reachable place (#2898)
Browse files Browse the repository at this point in the history
Trivial refactoring, fixes
#2885
  • Loading branch information
nazar-pc authored Jan 11, 2024
1 parent 2bdf5dc commit f270b08
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 43 deletions.
45 changes: 45 additions & 0 deletions substrate/client/cli/src/arg_enums.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
//! Definitions of [`ValueEnum`] types.

use clap::ValueEnum;
use std::str::FromStr;

/// The instantiation strategy to use in compiled mode.
#[derive(Debug, Clone, Copy, ValueEnum)]
Expand Down Expand Up @@ -177,6 +178,50 @@ impl Into<sc_service::config::RpcMethods> for RpcMethods {
}
}

/// CORS setting
///
/// The type is introduced to overcome `Option<Option<T>>` handling of `clap`.
#[derive(Clone, Debug)]
pub enum Cors {
/// All hosts allowed.
All,
/// Only hosts on the list are allowed.
List(Vec<String>),
}

impl From<Cors> for Option<Vec<String>> {
fn from(cors: Cors) -> Self {
match cors {
Cors::All => None,
Cors::List(list) => Some(list),
}
}
}

impl FromStr for Cors {
type Err = crate::Error;

fn from_str(s: &str) -> Result<Self, Self::Err> {
let mut is_all = false;
let mut origins = Vec::new();
for part in s.split(',') {
match part {
"all" | "*" => {
is_all = true;
break
},
other => origins.push(other.to_owned()),
}
}

if is_all {
Ok(Cors::All)
} else {
Ok(Cors::List(origins))
}
}
}

/// Database backend
#[derive(Debug, Clone, PartialEq, Copy, clap::ValueEnum)]
#[value(rename_all = "lower")]
Expand Down
45 changes: 2 additions & 43 deletions substrate/client/cli/src/commands/run_cmd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.

use crate::{
arg_enums::RpcMethods,
arg_enums::{Cors, RpcMethods},
error::{Error, Result},
params::{
ImportParams, KeystoreParams, NetworkParams, OffchainWorkerParams, SharedParams,
Expand Down Expand Up @@ -108,7 +108,7 @@ pub struct RunCmd {
/// value). Value of `all` will disable origin validation. Default is to
/// allow localhost and <https://polkadot.js.org> origins. When running in
/// `--dev` mode the default is to allow all origins.
#[arg(long, value_name = "ORIGINS", value_parser = parse_cors)]
#[arg(long, value_name = "ORIGINS")]
pub rpc_cors: Option<Cors>,

/// The human-readable name for this node.
Expand Down Expand Up @@ -470,47 +470,6 @@ fn rpc_interface(
}
}

/// CORS setting
///
/// The type is introduced to overcome `Option<Option<T>>` handling of `clap`.
#[derive(Clone, Debug)]
pub enum Cors {
/// All hosts allowed.
All,
/// Only hosts on the list are allowed.
List(Vec<String>),
}

impl From<Cors> for Option<Vec<String>> {
fn from(cors: Cors) -> Self {
match cors {
Cors::All => None,
Cors::List(list) => Some(list),
}
}
}

/// Parse cors origins.
fn parse_cors(s: &str) -> Result<Cors> {
let mut is_all = false;
let mut origins = Vec::new();
for part in s.split(',') {
match part {
"all" | "*" => {
is_all = true;
break
},
other => origins.push(other.to_owned()),
}
}

if is_all {
Ok(Cors::All)
} else {
Ok(Cors::List(origins))
}
}

#[cfg(test)]
mod tests {
use super::*;
Expand Down

0 comments on commit f270b08

Please sign in to comment.