plaintalk 0.0.15

A library for parsing and generating PlainTalk
Documentation
use std::io::{Read, Cursor};
use super::*;

fn buffer_message(message: &mut Message) -> Vec<String> {
	let mut parsed_message = Vec::new();
	while let Ok(Some(mut field)) = message.get_field() {
		let mut buffer = String::new();
		field.read_to_string(&mut buffer).unwrap();
		parsed_message.push(buffer);
	}
	parsed_message
}

fn buffer_all_messages<R: Read>(parser: &mut PullParser<R>) -> Vec<Vec<String>> {
	let mut parsed_messages = Vec::new();
	while let Ok(Some(mut message)) = parser.get_message() {
		parsed_messages.push(buffer_message(&mut message));
	}
	parsed_messages
}

#[test]
fn it_works() {
	let data = Cursor::new(b"0 ape katt lol" as &[u8]);
	let mut parser = PullParser::new(data);

	let mut message = parser.get_message().unwrap().unwrap();

	let mut buffer = String::new();

	message.get_field().unwrap().unwrap().read_to_string(&mut buffer).unwrap();
	assert_eq!("0", buffer);
	buffer.clear();

	message.get_field().unwrap().unwrap().read_to_string(&mut buffer).unwrap();
	assert_eq!("ape", buffer);
	buffer.clear();

	message.get_field().unwrap().unwrap().read_to_string(&mut buffer).unwrap();
	assert_eq!("katt", buffer);
	buffer.clear();
}

#[test]
fn it_can_parse_several_messages() {
	let data = Cursor::new(b"0 ape katt\n1 tam ape\n2 lol\n" as &[u8]);
	let mut parser = PullParser::new(data);

	assert_eq!(
		vec![
			vec!["0", "ape", "katt"],
			vec!["1", "tam", "ape"],
			vec!["2", "lol"],
			vec![""],
		],
		buffer_all_messages(&mut parser)
	);
}

#[test]
fn it_can_parse_escape_sequences() {
	let data = Cursor::new(b"{6}0{1} a{10}pe katt\nlol fie{3}ld 2\n" as &[u8]);
	let mut parser = PullParser::new(data);

	assert_eq!(vec!["0{1} ape katt\nlol", "field 2"], buffer_message(&mut parser.get_message().unwrap().unwrap()));
}

#[test]
fn it_handles_escape_overflow() {
	let data = Cursor::new(b"{9000000000000000000000}blahblah\n" as &[u8]);
	let mut parser = PullParser::new(data);
	let mut buffer = String::new();
	let result = parser.get_message().unwrap().unwrap().get_field().unwrap().unwrap().read_to_string(&mut buffer);
	assert!(result.is_err());
}

#[test]
fn it_understands_crlf() {
	let data = Cursor::new(b"0 ape\r\n1 katt\r\n" as &[u8]);
	let mut parser = PullParser::new(data);

	assert_eq!(
		vec![
			vec!["0", "ape"],
			vec!["1", "katt"],
			vec![""],
		],
		buffer_all_messages(&mut parser)
	);
}

#[test]
fn it_can_ignore_a_field() {
	let data = Cursor::new(b"field1 field2\n" as &[u8]);
	let mut parser = PullParser::new(data);

	let mut message = parser.get_message().unwrap().unwrap();

	message.get_field().unwrap().unwrap().ignore_rest().unwrap();

	let mut buffer = String::new();
	message.get_field().unwrap().unwrap().read_to_string(&mut buffer).unwrap();
	assert_eq!("field2", buffer);
}

#[test]
fn it_can_ignore_a_message() {
	let data = Cursor::new(b"msg1 msg1field2\nmsg2 msg2field2\n" as &[u8]);
	let mut parser = PullParser::new(data);

	let mut buffer = String::new();

	{
		let mut message = parser.get_message().unwrap().unwrap();
		message.get_field().unwrap().unwrap().read_to_string(&mut buffer).unwrap();
		assert_eq!("msg1", buffer);
		buffer.clear();
		message.ignore_rest().unwrap();
	}

	{
		let mut message = parser.get_message().unwrap().unwrap();
		message.get_field().unwrap().unwrap().read_to_string(&mut buffer).unwrap();
		assert_eq!("msg2", buffer);
		buffer.clear();
		message.ignore_rest().unwrap();
	}
}

#[test]
fn message_can_buffer_a_field() {
	let data = Cursor::new(b"0 protocol lol\n" as &[u8]);
	let mut parser = PullParser::new(data);

	let mut message = parser.get_message().unwrap().unwrap();

	{
		let buffer = &mut [0u8; 8];
		let len = message.read_field(buffer).unwrap().unwrap();
		assert_eq!(b"0".to_vec(), buffer[0..len].to_vec());
	}

	{
		let buffer = &mut [0u8; 8];
		let len = message.read_field(buffer).unwrap().unwrap();
		assert_eq!(b"protocol".to_vec(), buffer[0..len].to_vec());
	}
}

#[test]
fn message_can_detect_overflow_when_buffering_a_field() {
	let data = Cursor::new(b"protocol\n" as &[u8]);
	let mut parser = PullParser::new(data);

	let mut message = parser.get_message().unwrap().unwrap();

	{
		let buffer = &mut [0u8; 4];
		assert!(message.read_field(buffer).is_err());
	}
}

#[test]
fn message_can_read_field_to_end() {
	let data = Cursor::new(b"0 protocol\n" as &[u8]);
	let mut parser = PullParser::new(data);

	let mut message = parser.get_message().unwrap().unwrap();

	{
		let mut buffer = Vec::new();
		message.read_field_to_end(&mut buffer).unwrap().unwrap();
		assert_eq!(b"0".to_vec(), buffer);
	}

	{
		let mut buffer = Vec::new();
		message.read_field_to_end(&mut buffer).unwrap().unwrap();
		assert_eq!(b"protocol".to_vec(), buffer);
	}

	{
		let mut buffer = Vec::new();
		let result = message.read_field_to_end(&mut buffer).unwrap();
		assert!(result.is_none());
	}
}

#[test]
fn message_can_read_field_as_string() {
	let data = Cursor::new(b"0 protocol\n" as &[u8]);
	let mut parser = PullParser::new(data);

	let mut message = parser.get_message().unwrap().unwrap();

	assert_eq!("0", message.read_field_as_string().unwrap().unwrap());
	assert_eq!("protocol", message.read_field_as_string().unwrap().unwrap());
}

#[test]
fn message_can_read_field_as_slice() {
	let data = Cursor::new(b"0 protocol\n" as &[u8]);
	let mut parser = PullParser::new(data);

	let mut message = parser.get_message().unwrap().unwrap();
	let mut buffer = [0u8;10];

	assert_eq!(b"0", message.read_field_as_slice(&mut buffer).unwrap().unwrap());
	assert_eq!(b"protocol", message.read_field_as_slice(&mut buffer).unwrap().unwrap());
}

#[test]
fn message_can_tell_if_it_is_at_the_end() {
	let data = Cursor::new(b"0 protocol\n" as &[u8]);
	let mut parser = PullParser::new(data);

	let mut message = parser.get_message().unwrap().unwrap();

	assert_eq!(false, message.at_end());
	message.read_field_as_string().unwrap();
	assert_eq!(false, message.at_end());
	message.read_field_as_string().unwrap();
	assert_eq!(true, message.at_end());
}

#[test]
fn parser_can_read_a_message() {
	let data = Cursor::new(b"0 protocol lol\n2 lol\n" as &[u8]);
	let mut parser = PullParser::new(data);

	assert_eq!([b"0".to_vec(), b"protocol".to_vec(), b"lol".to_vec()].to_vec(), parser.read_message().unwrap().unwrap());
	assert_eq!([b"2".to_vec(), b"lol".to_vec()].to_vec(), parser.read_message().unwrap().unwrap());
}

#[test]
fn it_ignores_empty_lines() {
	let data = Cursor::new(b"0 protocol lol\n\n{}\n{0}{00}{000}\n2 lol\n" as &[u8]);
	let mut parser = PullParser::new(data);

	assert_eq!([b"0".to_vec(), b"protocol".to_vec(), b"lol".to_vec()].to_vec(), parser.read_message().unwrap().unwrap());
	assert_eq!([b"2".to_vec(), b"lol".to_vec()].to_vec(), parser.read_message().unwrap().unwrap());
}