use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(untagged)]
pub enum PlutusInt {
Number(i64),
String(String),
}
impl From<i64> for PlutusInt {
fn from(v: i64) -> Self { Self::Number(v) }
}
impl From<i32> for PlutusInt {
fn from(v: i32) -> Self { Self::Number(v as i64) }
}
impl From<u32> for PlutusInt {
fn from(v: u32) -> Self { Self::Number(v as i64) }
}
impl From<String> for PlutusInt {
fn from(v: String) -> Self { Self::String(v) }
}
impl From<&str> for PlutusInt {
fn from(v: &str) -> Self { Self::String(v.to_string()) }
}
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(untagged)]
pub enum PlutusData {
Constr {
constructor: u64,
fields: Vec<PlutusData>,
},
Map {
map: Vec<PlutusDataMapEntry>,
},
List {
list: Vec<PlutusData>,
},
Int {
int: PlutusInt,
},
Bytes {
bytes: String,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct PlutusDataMapEntry {
pub k: PlutusData,
pub v: PlutusData,
}
impl PlutusData {
pub fn constr(idx: u64, fields: Vec<PlutusData>) -> Self {
Self::Constr { constructor: idx, fields }
}
pub fn unit() -> Self {
Self::Constr { constructor: 0, fields: vec![] }
}
pub fn int(n: impl Into<PlutusInt>) -> Self {
Self::Int { int: n.into() }
}
pub fn bytes(hex: impl Into<String>) -> Self {
Self::Bytes { bytes: hex.into() }
}
pub fn list(items: Vec<PlutusData>) -> Self {
Self::List { list: items }
}
pub fn map(entries: impl IntoIterator<Item = (PlutusData, PlutusData)>) -> Self {
Self::Map {
map: entries.into_iter().map(|(k, v)| PlutusDataMapEntry { k, v }).collect(),
}
}
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Redeemer {
pub data: PlutusData,
pub ex_units: ExUnits,
}
impl Redeemer {
pub fn new(data: PlutusData, ex_units: ExUnits) -> Self {
Self { data, ex_units }
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ExUnits {
pub mem: u64,
pub steps: u64,
}