risq 0.4.1

Re-implementation of Bisq (https://github.com/bisq-network/bisq) in rust
use crate::domain::{amount::*, offer::*};

pub struct BtcOffer<'a> {
    inner: &'a OpenOffer,
}

impl<'a> BtcOffer<'a> {
    pub fn new(offer: &'a OpenOffer) -> Self {
        Self { inner: offer }
    }

    pub fn direction(&self) -> OfferDirection {
        if self.inner.market.non_btc_side().is_crypto() {
            self.inner.direction.oposite()
        } else {
            self.inner.direction
        }
    }

    pub fn volume(&self) -> NumberWithPrecision {
        if self.inner.market.non_btc_side().is_crypto() {
            self.inner.amount.total
        } else {
            self.inner.display_price * self.inner.amount.total
        }
    }

    pub fn amount(&self) -> NumberWithPrecision {
        if self.inner.market.non_btc_side().is_crypto() {
            self.inner.amount.total / self.inner.display_price
        } else {
            self.inner.amount.total
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::{bisq::SequencedMessageHash, domain::market::*};
    use bitcoin_hashes::sha256;
    use std::{str::FromStr, time::UNIX_EPOCH};

    fn fiat_offer() -> OpenOffer {
        OpenOffer::new(
            SequencedMessageHash::new(
                sha256::Hash::from_str(
                    &"2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824",
                )
                .unwrap(),
            ),
            Market::from_pair("btc_eur").unwrap(),
            "fiat-offer".to_string().into(),
            OfferDirection::Buy,
            OfferPrice::Fixed(NumberWithPrecision::new(1000, 0)),
            OfferAmount {
                total: NumberWithPrecision::new(1, 0),
                min: NumberWithPrecision::new(5, 1),
            },
            "PAYMENT_METHOD".into(),
            "OFFER_FEE_TX_ID".into(),
            UNIX_EPOCH,
            0.into(),
        )
    }

    fn crypto_offer() -> OpenOffer {
        OpenOffer::new(
            SequencedMessageHash::new(
                sha256::Hash::from_str(
                    &"2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824",
                )
                .unwrap(),
            ),
            Market::from_pair("bsq_btc").unwrap(),
            "fiat-offer".to_string().into(),
            OfferDirection::Sell,
            OfferPrice::Fixed(NumberWithPrecision::new(7800, 8)),
            OfferAmount {
                total: NumberWithPrecision::new(5, 1),
                min: NumberWithPrecision::new(5, 1),
            },
            "PAYMENT_METHOD".into(),
            "OFFER_FEE_TX_ID".into(),
            UNIX_EPOCH,
            0.into(),
        )
    }

    #[test]
    fn test_fiat_offer() {
        let fiat_offer = fiat_offer();
        let btc_offer = BtcOffer::new(&fiat_offer);
        assert!(btc_offer.direction() == OfferDirection::Buy);
        assert!(btc_offer.volume() == NumberWithPrecision::new(1000, 0));
        assert!(btc_offer.amount() == NumberWithPrecision::new(1, 0));
    }

    #[test]
    fn test_crypto_offer() {
        let crypto_offer = crypto_offer();
        let btc_offer = BtcOffer::new(&crypto_offer);
        assert!(btc_offer.direction() == OfferDirection::Buy);
        assert!(btc_offer.volume() == NumberWithPrecision::new(5, 1));
        assert!(btc_offer.amount() == NumberWithPrecision::new(641025641025, 8));
    }
}