serde_spaniel 0.4.0

Spaniel Interactive Deserialiser for Serde
Documentation
use serde::Deserialize;
use serde_spaniel::*;

use super::golden::{self, Golden};
use super::mock::MockPrompt;

fn test_de<'a, G: Golden>()
where
  G::V: Deserialize<'a>,
{
  let mut prompt = MockPrompt::new(G::responses(false).into_iter());
  let value: G::V = from_bare_prompt(&mut prompt).unwrap();
  assert_eq!(value, G::value());
  assert_eq!(prompt.scope_names(), G::scope_names())
}

#[test]
fn struct_of_prims() {
  test_de::<golden::StructOfPrimsCase>()
}

#[test]
fn struct_of_seqs() {
  test_de::<golden::StructOfSeqsCase>()
}

#[test]
fn tuple_of_options() {
  test_de::<golden::TupleOfOptionsCase>()
}

#[test]
fn tuple_of_units() {
  test_de::<golden::TupleOfUnitsCase>()
}

#[test]
fn seq_of_seqs() {
  test_de::<golden::SeqOfSeqsCase>()
}

#[test]
fn map_of_enums_and_newtypes() {
  test_de::<golden::MapOfEnumsAndNewtypesCase>()
}

#[test]
fn bad_u32() {
  let vec = vec!["not a number"].into_iter();
  let value: Result<u32> = from_bare_prompt(MockPrompt::new(vec));
  assert_eq!(value, Err(Error::BadResponse))
}

#[test]
fn bad_u32_interactive() {
  let vec = vec!["not a number", "another string", "123"].into_iter();
  let value: u32 =
    from_bare_prompt(MockPrompt::new(vec).with_interactive()).unwrap();
  assert_eq!(value, 123)
}

#[test]
fn bytes() {
  test_de::<golden::BytesCase>()
}