Consolidate ledger serialization code
The new read_entries() works, but is overly-contrained. Not using that function yet, but adding it here in the hopes some Rust guru will tell us how to get that lifetime constraint out of there. Fixes #517
This commit is contained in:
parent
e7b7dfebf5
commit
ec7e50b37d
|
@ -519,10 +519,9 @@ mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use bincode::serialize;
|
use bincode::serialize;
|
||||||
use entry::next_entry;
|
use entry::next_entry;
|
||||||
use entry_writer::EntryWriter;
|
use entry_writer::{self, EntryWriter};
|
||||||
use hash::hash;
|
use hash::hash;
|
||||||
use ledger::next_entries;
|
use ledger::next_entries;
|
||||||
use serde_json;
|
|
||||||
use signature::KeyPairUtil;
|
use signature::KeyPairUtil;
|
||||||
use std::io::{BufRead, BufReader, Seek, SeekFrom};
|
use std::io::{BufRead, BufReader, Seek, SeekFrom};
|
||||||
|
|
||||||
|
@ -800,12 +799,12 @@ mod tests {
|
||||||
|
|
||||||
let mut file = tempfile().unwrap();
|
let mut file = tempfile().unwrap();
|
||||||
EntryWriter::write_entries(&mut file, &entries).unwrap();
|
EntryWriter::write_entries(&mut file, &entries).unwrap();
|
||||||
|
|
||||||
file.seek(SeekFrom::Start(0)).unwrap();
|
file.seek(SeekFrom::Start(0)).unwrap();
|
||||||
|
|
||||||
let reader = BufReader::new(file);
|
let reader = BufReader::new(file);
|
||||||
reader
|
reader
|
||||||
.lines()
|
.lines()
|
||||||
.map(|line| serde_json::from_str(&line.unwrap()).unwrap())
|
.map(|line| entry_writer::read_entry(line.unwrap()).unwrap())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
|
@ -9,7 +9,7 @@ use atty::{is, Stream};
|
||||||
use getopts::Options;
|
use getopts::Options;
|
||||||
use solana::bank::Bank;
|
use solana::bank::Bank;
|
||||||
use solana::crdt::ReplicatedData;
|
use solana::crdt::ReplicatedData;
|
||||||
use solana::entry::Entry;
|
use solana::entry_writer;
|
||||||
use solana::server::Server;
|
use solana::server::Server;
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
|
@ -68,11 +68,10 @@ fn main() {
|
||||||
eprintln!("Initializing...");
|
eprintln!("Initializing...");
|
||||||
let stdin = stdin();
|
let stdin = stdin();
|
||||||
let entries = stdin.lock().lines().map(|line| {
|
let entries = stdin.lock().lines().map(|line| {
|
||||||
let entry: Entry = serde_json::from_str(&line.unwrap()).unwrap_or_else(|e| {
|
entry_writer::read_entry(line.unwrap()).unwrap_or_else(|e| {
|
||||||
eprintln!("failed to parse json: {}", e);
|
eprintln!("failed to parse json: {}", e);
|
||||||
exit(1);
|
exit(1);
|
||||||
});
|
})
|
||||||
entry
|
|
||||||
});
|
});
|
||||||
eprintln!("done parsing...");
|
eprintln!("done parsing...");
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
use bank::Bank;
|
use bank::Bank;
|
||||||
use entry::Entry;
|
use entry::Entry;
|
||||||
use serde_json;
|
use serde_json;
|
||||||
use std::io::{self, Write};
|
use std::io::{self, BufRead, Error, ErrorKind, Write};
|
||||||
|
|
||||||
pub struct EntryWriter<'a, W> {
|
pub struct EntryWriter<'a, W> {
|
||||||
bank: &'a Bank,
|
bank: &'a Bank,
|
||||||
|
@ -46,6 +46,17 @@ impl<'a, W: Write> EntryWriter<'a, W> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn read_entry(s: String) -> io::Result<Entry> {
|
||||||
|
serde_json::from_str(&s).map_err(|e| Error::new(ErrorKind::Other, e.to_string()))
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: How to implement this without attaching the input's lifetime to the output?
|
||||||
|
pub fn read_entries<'a, R: BufRead>(
|
||||||
|
reader: &'a mut R,
|
||||||
|
) -> impl Iterator<Item = io::Result<Entry>> + 'a {
|
||||||
|
reader.lines().map(|s| read_entry(s?))
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
Loading…
Reference in New Issue