Skip to content
This repository has been archived by the owner on Oct 19, 2024. It is now read-only.

feat(solc): add from_str for Remapping #583

Merged
merged 1 commit into from
Nov 14, 2021
Merged
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
52 changes: 41 additions & 11 deletions ethers-solc/src/remappings.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use crate::{error::SolcError, Result};
use serde::{Deserialize, Serialize};
use std::fmt;
use std::{fmt, str::FromStr};

const DAPPTOOLS_CONTRACTS_DIR: &str = "src";
const JS_CONTRACTS_DIR: &str = "contracts";
Expand Down Expand Up @@ -42,6 +42,31 @@ pub struct Remapping {
pub path: String,
}

#[derive(thiserror::Error, Debug, PartialEq, PartialOrd)]
pub enum RemappingError {
#[error("no prefix found")]
NoPrefix,
#[error("no target found")]
NoTarget,
}

impl FromStr for Remapping {
type Err = RemappingError;

fn from_str(remapping: &str) -> std::result::Result<Self, Self::Err> {
let mut split = remapping.split('=');
let name = split.next().ok_or_else(|| RemappingError::NoPrefix)?.to_string();
if name.is_empty() {
return Err(RemappingError::NoPrefix)
}
let path = split.next().ok_or_else(|| RemappingError::NoTarget)?.to_string();
if path.is_empty() {
return Err(RemappingError::NoTarget)
}
Ok(Remapping { name, path })
}
}

impl Serialize for Remapping {
fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
where
Expand All @@ -57,16 +82,7 @@ impl<'de> Deserialize<'de> for Remapping {
D: serde::de::Deserializer<'de>,
{
let remapping = String::deserialize(deserializer)?;
let mut split = remapping.split('=');
let name = split
.next()
.ok_or_else(|| serde::de::Error::custom("no remapping prefix found"))?
.to_string();
let path = split
.next()
.ok_or_else(|| serde::de::Error::custom("no remapping path found"))?
.to_string();
Ok(Remapping { name, path })
Remapping::from_str(&remapping).map_err(|e| serde::de::Error::custom(e))
}
}

Expand Down Expand Up @@ -163,6 +179,20 @@ impl Remapping {
mod tests {
use super::*;

#[test]
fn serde() {
let remapping = "oz=../b/c/d";
let remapping = Remapping::from_str(&remapping).unwrap();
assert_eq!(remapping.name, "oz".to_string());
assert_eq!(remapping.path, "../b/c/d".to_string());

let err = Remapping::from_str("").unwrap_err();
assert_eq!(err, RemappingError::NoPrefix);

let err = Remapping::from_str("oz=").unwrap_err();
assert_eq!(err, RemappingError::NoTarget);
}

// https://doc.rust-lang.org/rust-by-example/std_misc/fs.html
fn touch(path: &std::path::Path) -> std::io::Result<()> {
match std::fs::OpenOptions::new().create(true).write(true).open(path) {
Expand Down