poa-bridge/src/database.rs

122 lines
3.1 KiB
Rust
Raw Normal View History

2017-06-25 04:21:13 -07:00
use std::path::Path;
use std::fs;
use std::io::{Read, Write};
use toml;
2017-08-02 03:45:15 -07:00
use error::{Error, ResultExt};
2017-06-25 04:21:13 -07:00
/// Application "database".
#[derive(Debug, PartialEq, Deserialize, Serialize)]
2017-08-01 02:36:48 -07:00
pub struct Database {
2017-06-25 04:21:13 -07:00
pub mainnet: BlockchainState,
pub testnet: BlockchainState,
}
2017-08-01 02:36:48 -07:00
impl Database {
2017-08-02 03:45:15 -07:00
pub fn load<P: AsRef<Path>>(path: P) -> Result<Database, Error> {
let mut file = fs::File::open(path).chain_err(|| "Cannot open database")?;
2017-06-25 04:21:13 -07:00
let mut buffer = String::new();
file.read_to_string(&mut buffer);
Self::load_from_str(&buffer)
}
2017-08-02 03:45:15 -07:00
fn load_from_str(s: &str) -> Result<Database, Error> {
let data = toml::from_str(s).chain_err(|| "Cannot parse database")?;
2017-06-25 04:21:13 -07:00
Ok(data)
}
2017-08-02 03:45:15 -07:00
pub fn save<P: AsRef<Path>>(&self, path: P) -> Result<(), Error> {
let mut file = fs::File::open(path).chain_err(|| "Cannot save database")?;
2017-06-25 04:21:13 -07:00
file.write_all(self.save_to_string().as_bytes())?;
Ok(())
}
fn save_to_string(&self) -> String {
toml::to_string(self).expect("serialization can't fail; qed")
}
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct BlockchainState {
/// Block number at which bridge has been deployed.
pub deploy_block_number: u64,
/// Bridge contract address.
pub bridge_contract_address: String,
/// Last handled block number
pub last_block_number: u64,
}
impl BlockchainState {
pub fn new(block_number: u64, contract_address: String) -> Self {
BlockchainState {
deploy_block_number: block_number,
bridge_contract_address: contract_address,
last_block_number: block_number,
}
}
}
#[cfg(test)]
mod tests {
2017-08-01 02:36:48 -07:00
use super::{Database, BlockchainState};
2017-06-25 04:21:13 -07:00
#[test]
fn laod_databse_from_str() {
let toml = r#"
[mainnet]
deploy_block_number = 100
bridge_contract_address = "0x49edf201c1e139282643d5e7c6fb0c7219ad1db7"
last_block_number = 120
[testnet]
deploy_block_number = 101
bridge_contract_address = "0x49edf201c1e139282643d5e7c6fb0c7219ad1db8"
last_block_number = 121
"#;
2017-08-01 02:36:48 -07:00
let expected = Database {
2017-06-25 04:21:13 -07:00
mainnet: BlockchainState {
deploy_block_number: 100,
bridge_contract_address: "0x49edf201c1e139282643d5e7c6fb0c7219ad1db7".to_owned(),
last_block_number: 120,
},
testnet: BlockchainState {
deploy_block_number: 101,
bridge_contract_address: "0x49edf201c1e139282643d5e7c6fb0c7219ad1db8".to_owned(),
last_block_number: 121,
},
};
2017-08-01 02:36:48 -07:00
let database = Database::load_from_str(toml).unwrap();
2017-06-25 04:21:13 -07:00
assert_eq!(expected, database);
}
#[test]
fn save_database_to_string() {
2017-08-01 02:36:48 -07:00
let database = Database {
2017-06-25 04:21:13 -07:00
mainnet: BlockchainState {
deploy_block_number: 100,
bridge_contract_address: "0x49edf201c1e139282643d5e7c6fb0c7219ad1db7".to_owned(),
last_block_number: 120,
},
testnet: BlockchainState {
deploy_block_number: 101,
bridge_contract_address: "0x49edf201c1e139282643d5e7c6fb0c7219ad1db8".to_owned(),
last_block_number: 121,
},
};
let expected = r#"[mainnet]
deploy_block_number = 100
bridge_contract_address = "0x49edf201c1e139282643d5e7c6fb0c7219ad1db7"
last_block_number = 120
[testnet]
deploy_block_number = 101
bridge_contract_address = "0x49edf201c1e139282643d5e7c6fb0c7219ad1db8"
last_block_number = 121
"#;
let raw = database.save_to_string();
assert_eq!(expected, &raw);
}
}