naumachia 0.2.0

Cardano Smart-Contract Framework
Documentation
use crate::{Address, PolicyId};
use serde::{Deserialize, Serialize};

use crate::values::Values;

#[derive(Clone, PartialEq, Debug, Eq, Deserialize, Serialize)]
pub enum UnbuiltOutput<Datum> {
    Wallet {
        owner: Address,
        values: Values,
    },
    Validator {
        script_address: Address,
        values: Values,
        datum: Datum,
    },
}

impl<Datum> UnbuiltOutput<Datum> {
    pub fn new_wallet(owner: Address, values: Values) -> Self {
        UnbuiltOutput::Wallet { owner, values }
    }

    pub fn new_validator(script_address: Address, values: Values, datum: Datum) -> Self {
        UnbuiltOutput::Validator {
            script_address,
            values,
            datum,
        }
    }

    pub fn owner(&self) -> &Address {
        match self {
            UnbuiltOutput::Wallet { owner, .. } => owner,
            UnbuiltOutput::Validator { script_address, .. } => script_address,
        }
    }

    pub fn values(&self) -> &Values {
        match self {
            UnbuiltOutput::Wallet { values, .. } => values,
            UnbuiltOutput::Validator { values, .. } => values,
        }
    }

    pub fn datum(&self) -> Option<&Datum> {
        match self {
            UnbuiltOutput::Wallet { .. } => None,
            UnbuiltOutput::Validator { datum, .. } => Some(datum),
        }
    }
}

#[serde_with::serde_as]
#[derive(Clone, PartialEq, Debug, Eq, Deserialize, Serialize)]
pub enum Output<Datum> {
    Wallet {
        id: OutputId,
        owner: Address,
        values: Values,
    },
    Validator {
        id: OutputId,
        owner: Address,
        values: Values,
        datum: Datum,
    },
}

#[derive(Clone, PartialEq, Debug, Eq, Deserialize, Serialize)]
pub struct OutputId {
    tx_hash: String,
    index: u64,
}

impl OutputId {
    pub fn new(tx_hash: String, index: u64) -> Self {
        OutputId { tx_hash, index }
    }

    pub fn tx_hash(&self) -> &str {
        &self.tx_hash
    }

    pub fn index(&self) -> u64 {
        self.index
    }
}

pub type Value = (PolicyId, u64);

impl<Datum> Output<Datum> {
    pub fn new_wallet(tx_hash: String, index: u64, owner: Address, values: Values) -> Self {
        let id = OutputId::new(tx_hash, index);
        Output::Wallet { id, owner, values }
    }

    pub fn new_validator(
        tx_hash: String,
        index: u64,
        owner: Address,
        values: Values,
        datum: Datum,
    ) -> Self {
        let id = OutputId::new(tx_hash, index);
        Output::Validator {
            id,
            owner,
            values,
            datum,
        }
    }

    pub fn id(&self) -> &OutputId {
        match self {
            Output::Wallet { id, .. } => id,
            Output::Validator { id, .. } => id,
        }
    }

    pub fn owner(&self) -> &Address {
        match self {
            Output::Wallet { owner, .. } => owner,
            Output::Validator { owner, .. } => owner,
        }
    }

    pub fn values(&self) -> &Values {
        match self {
            Output::Wallet { values, .. } => values,
            Output::Validator { values, .. } => values,
        }
    }

    pub fn datum(&self) -> Option<&Datum> {
        match self {
            Output::Wallet { .. } => None,
            Output::Validator { datum, .. } => Some(datum),
        }
    }
}