jlib 0.3.7

A lightweight blockchain lib.
Documentation
#![allow(unused)]

use serde_json::json;
use serde::{Deserialize, Serialize};
use serde_json::Result;
use std::any::Any;

use crate::message::common::command_trait::CommandConversion;
use crate::message::tx_flags::*;
use crate::message::common::amount::{Amount, string_or_struct};
use std::error::Error;
use std::fmt;

#[derive(Serialize, Deserialize, Debug, Default)]
pub struct OrderBookItem {
    #[serde(rename="currency")]
    pub currency: String,

    #[serde(rename="issuer")]
    pub issuer: String,
}

impl OrderBookItem {
    pub fn with_params(currency: String, issuer: String) -> Self {
        OrderBookItem {
            currency: currency,
            issuer: issuer,
        }
    }
}

#[derive(Serialize, Deserialize, Debug)]
pub struct RequestOrderBookCommand {
    #[serde(rename="id")]
    pub id: u64,

    #[serde(rename="command")]
    pub command: String,

    #[serde(rename="taker_gets")]
    pub taker_gets: OrderBookItem,

    #[serde(rename="taker_pays")]
    pub taker_pays: OrderBookItem,

    #[serde(rename="taker")]
    pub taker: String,
}

impl RequestOrderBookCommand {
    pub fn with_params(gets: OrderBookItem, pays: OrderBookItem) -> Box<Self> {
        Box::new(
            RequestOrderBookCommand {
                id: 1,
                command: "book_offers".to_string(),
                taker_gets: gets,
                taker_pays: pays,
                taker: "jjjjjjjjjjjjjjjjjjjjBZbvri".to_string(),
            }
        )
    }
}

impl CommandConversion for RequestOrderBookCommand {
    type T = RequestOrderBookCommand;
    fn to_string(&self) -> Result<String> {
        let j = serde_json::to_string(&self)?;

        Ok(j)
    }

    fn box_to_raw(&self) -> &dyn Any {
        self
    }
}

#[derive(Serialize, Deserialize, Debug)]
pub struct Offer {
    #[serde(rename="Account")]
    pub account: String,

    #[serde(rename="BookDirectory")]
    pub book_directory: String,

    #[serde(rename="BookNode")]
    pub book_node: String,

    #[serde(rename="Flags")]
    pub flags: u64,

    #[serde(rename="LedgerEntryType")]
    pub ledger_entry_type: String,

    #[serde(rename="OwnerNode")]
    pub owner_node: String,

    #[serde(rename="PreviousTxnID")]
    pub previous_txn_id: String,

    #[serde(rename="PreviousTxnLgrSeq")]
    pub previous_txn_lgr_seq: u64,

    #[serde(rename="Sequence")]
    pub sequence: u64,

    #[serde(rename="TakerGets")]
    #[serde(deserialize_with = "string_or_struct")]
    pub taker_gets: Amount,

    #[serde(rename="TakerPays")]
    #[serde(deserialize_with = "string_or_struct")]
    pub taker_pays: Amount,

    #[serde(rename="index")]
    pub index: String,

    #[serde(rename="owner_funds")]
    pub owner_funds: Option<String>,

    #[serde(rename="quality")]
    pub quality: String,
}

#[derive(Serialize, Deserialize, Debug)]
pub struct RequestOrderBookResponse {
    #[serde(rename="ledger_current_index")]
    pub ledger_current_index: u64,

    #[serde(rename="offers")]
    pub offers: Vec<Offer>,

    #[serde(rename="validated")]
    pub validated: bool,
}


#[derive(Debug, Serialize, Deserialize)]
pub struct OrderBookSideKick {
    pub error           : String,
    pub error_code      : i32,
    pub error_message   : String,
    pub id              : u32,
    pub request         : RequestOrderBookCommand,
    pub status          : String,

    #[serde(rename="type")]
    pub rtype            : String,
}

impl fmt::Display for OrderBookSideKick {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "OrderBookSideKick is here!")
    }
}

impl Error for OrderBookSideKick  {
    fn description(&self) -> &str {
        "I'm OrderBookSideKick side kick"
    }
}