hedera 0.1.0

Hedera SDK for Rust
use crate::{
    proto::{self, ToProto},
    Client, Duration, ErrorKind, PublicKey, Transaction,
};
use failure::Error;

pub struct TransactionCreateAccount {
    key: Option<PublicKey>,
    initial_balance: u64,
}

impl Transaction<TransactionCreateAccount> {
    pub fn create_account(client: &Client) -> Self {
        Self::new(
            client,
            TransactionCreateAccount {
                key: None,
                initial_balance: 0,
            },
        )
    }

    pub fn key(&mut self, key: PublicKey) -> &mut Self {
        self.inner.key = Some(key);
        self
    }

    pub fn initial_balance(&mut self, balance: u64) -> &mut Self {
        self.inner.initial_balance = balance;
        self
    }
}

impl ToProto<proto::Transaction::TransactionBody_oneof_data> for TransactionCreateAccount {
    fn to_proto(&self) -> Result<proto::Transaction::TransactionBody_oneof_data, Error> {
        let mut data = proto::CryptoCreate::CryptoCreateTransactionBody::new();
        data.set_initialBalance(self.initial_balance);

        let key = match self.key.as_ref() {
            Some(key) => key,
            None => Err(ErrorKind::MissingField("public_key"))?,
        };

        data.set_key(key.to_proto()?);
        data.set_autoRenewPeriod(Duration::new(2_592_000, 0).to_proto()?);

        Ok(proto::Transaction::TransactionBody_oneof_data::cryptoCreateAccount(data))
    }
}