photon_decode 0.2.1

Set of utilities for decoding messages generated by photon framework.
Documentation
use photon_decode;

use photon_decode::Message;
use photon_decode::EventData;
use photon_decode::OperationRequest;
use photon_decode::OperationResponse;
use photon_decode::Value;
use photon_decode::Parameters;

#[test]
fn test_single_event_message()
{
    let header = vec![
		0x00, 0x01, 			// PeerID
		0x01,                   // CrcEnabled
		0x01,                   // CommandCount
		0x00, 0x00, 0x00, 0x01, // Timestamp
		0x00, 0x00, 0x00, 0x01, // Challenge
    ];

	let photon_command = vec![
		0x06,                   // Type
		0x01,                   // ChannelID
		0x01,                   // Flags
		0x04,                   // ReservedByte
		0x00, 0x00, 0x00, 0x1a, // Length
		0x00, 0x00, 0x00, 0x01, // ReliableSequenceNumber
    ];

	let message = vec![
		0x01,							// ??
		0x04,							// MsgType (Event)
										// Payload
		0x64, 0x00, 0x02, 				// Key
		0x00, 0x73, 					// String type
		0x00, 0x05,						// String length
		0x74, 0x65, 0x73, 0x74, 0x31	//test1
	];

	let mut photon = photon_decode::Photon::new();

	let mut decoded = photon.try_decode(
		&[&header[..], &photon_command[..], &message[..]].concat()).expect("Shold works").into_iter();
	let msg = decoded.next().expect("Shold contain one msg").expect("Should decode event");

	let parameters: Parameters =
		[(0, Value::String("test1".to_owned()))]
    	.iter().cloned().collect();
	assert_eq!(msg, Message::Event(EventData{ code: 100,  parameters}));
}

#[test]
fn test_fragmented_event_message()
{
    let header = vec![
		0x00, 0x01, 			// PeerID
		0x01,                   // CrcEnabled
		0x01,                   // CommandCount
		0x00, 0x00, 0x00, 0x01, // Timestamp
		0x00, 0x00, 0x00, 0x01, // Challenge
    ];

    let mut photon = photon_decode::Photon::new();

	let photon_command = vec![
		0x08,                   // Type
		0x01,                   // ChannelID
		0x01,                   // Flags
		0x04,                   // ReservedByte
		0x00, 0x00, 0x00, 0x22, // Length
		0x00, 0x00, 0x00, 0x01, // ReliableSequenceNumber
		0x00, 0x00, 0x00, 0x01, // SequenceNumber
		0x00, 0x00, 0x00, 0x03, // FragmentCount
		0x00, 0x00, 0x00, 0x01, // FragmentNumber
		0x00, 0x00, 0x00, 0x1a, // TotalLength
		0x00, 0x00, 0x00, 0x01, // OperationLength
    ];

	let message = vec![
		0x01,							// ??
		0x04,							// MsgType (Event)
										// Payload
	];

    let decoded = photon.decode(
		&[&header[..], &photon_command[..], &message[..]].concat());
	assert!(decoded.len() == 0);

	let photon_command = vec![
		0x08,                   // Type
		0x01,                   // ChannelID
		0x01,                   // Flags
		0x04,                   // ReservedByte
		0x00, 0x00, 0x00, 0x27, // Length
		0x00, 0x00, 0x00, 0x01, // ReliableSequenceNumber
		0x00, 0x00, 0x00, 0x01, // SequenceNumber
		0x00, 0x00, 0x00, 0x03, // FragmentCount
		0x00, 0x00, 0x00, 0x02, // FragmentNumber
		0x00, 0x00, 0x00, 0x1a, // TotalLength
		0x00, 0x00, 0x00, 0x01, // OperationLength
    ];

	let message = vec![
										// Payload
		0x64, 0x00, 0x02, 				// Key
		0x00, 0x73, 					// String type
		0x00, 0x05,						// String length
	];

    let decoded = photon.decode(
		&[&header[..], &photon_command[..], &message[..]].concat());
	assert!(decoded.len() == 0);

	let photon_command = vec![
		0x08,                   // Type
		0x01,                   // ChannelID
		0x01,                   // Flags
		0x04,                   // ReservedByte
		0x00, 0x00, 0x00, 0x25, // Length
		0x00, 0x00, 0x00, 0x01, // ReliableSequenceNumber
		0x00, 0x00, 0x00, 0x01, // SequenceNumber
		0x00, 0x00, 0x00, 0x03, // FragmentCount
		0x00, 0x00, 0x00, 0x03, // FragmentNumber
		0x00, 0x00, 0x00, 0x1a, // TotalLength
		0x00, 0x00, 0x00, 0x01, // OperationLength
    ];

	let message = vec![
		0x74, 0x65, 0x73, 0x74, 0x31	//test1
	];

    let decoded = photon.decode(
		&[&header[..], &photon_command[..], &message[..]].concat());
	assert_eq!(decoded.len(), 1);

	let parameters: Parameters =
		[(0, Value::String("test1".to_owned()))]
    	.iter().cloned().collect();
	assert_eq!(decoded[0], Message::Event(EventData{ code: 100,  parameters}));
}


#[test]
fn test_two_event_messages()
{
	let payload = vec![
		0x00, 0x00, 
		0x00, 
		0x02, 
		0x72, 0xe9, 0xe2, 0x84, 
		0x11, 0x63, 0x88, 0x88,

		0x07, 
		0x00, 
		0x00, 
		0x00, 
		0x00, 0x00, 0x00, 0x45, 
		0x00, 0x00, 0x16, 0x8e, 
		0x00, 0x00, 0x45, 0x2b, 
		0xf3, 0x04, 0x02, 0x00, 0x02, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa, 0xb7, 0x36, 0x01, 0x78, 0x00, 0x00, 0x00, 0x20, 0x03, 0x6b, 0xc9, 0x04, 0xc1, 0xe2, 0x62, 0xd7, 0x08, 0x6b, 0xb0, 0x91, 0xc1, 0x2a, 0x80, 0x1b, 0xc2, 0x26, 0x00, 0x00, 0xb0, 0x40, 0xd8, 0xe6, 0x53, 0xc1, 0x8f, 0xcd, 0xc, 0xc2, 0x00, 0x00,

		0x06, 
		0x00, 
		0x01, 
		0x00, 
		0x00, 0x00, 0x00, 0x1b, 
		0x00, 0x00, 0x16, 0x8f, 
		0xf3, 0x04, 0x01, 0x00, 0x02, 0x00, 0x69, 0x00, 0xa, 0xf6, 0xdf, 0xfc, 0x6b, 0x00, 0x01
	];

    let mut photon = photon_decode::Photon::new();

    let decoded = photon.decode(&payload);

	assert!(decoded.len() == 2);
	let parameters: Parameters =
		[
			(0x01, Value::ByteArray(vec![
				3, 107, 201, 4, 193, 226, 98, 215, 8, 107, 176, 145, 193, 
				42, 128, 27, 194, 38, 0, 0, 176, 64, 216, 230, 83, 193, 
				143, 205, 12, 194, 0, 0])),	
			(0x00, Value::Long(702262))
		]
    	.iter().cloned().collect();
	assert_eq!(decoded[0], Message::Event(EventData{ code: 2,  parameters}));

	let parameters: Parameters =
		[
			(0x00, Value::Integer(718559)),
			(0xfc, Value::Short(1))
		]
    	.iter().cloned().collect();
	assert_eq!(decoded[1], Message::Event(EventData{ code: 1,  parameters}));

}

#[test]
fn test_request_message()
{
	let payload = vec![
		0x7d, 0xd3, 
		0x00, 
		0x01, 
		0x00, 0x04, 0xcc, 0xb6, 
		0x11, 0x63, 0x88, 0x88, 
		
		0x06, 
		0x00, 
		0x01, 
		0x04, 
		0x00, 0x00, 0x00, 0x2a, 
		0x00, 0x00, 0x00, 0x19, 
		0xf3, 0x02, 0x01, 0x00, 0x03, 0x00, 
		0x79, 0x00, 0x02, 0x66, 0xc1, 0xd3, 0x61, 0x20, 0xc2, 0x27, 0xc, 0xcd, 0x01, 0x62, 
		0x00, 0xfd, 					// key
		0x73, 							// String type
		0x00, 0x05,						// String length
		0x74, 0x65, 0x73, 0x74, 0x31	// test1
	];

    let mut photon = photon_decode::Photon::new();
    let decoded = photon.decode(&payload);

	assert!(decoded.len() == 1);
	let parameters: Parameters =
		[
			(0x00, Value::Array(vec![Value::Float(-26.422424), Value::Float(-41.7625)])),
			(0x01, Value::Byte(0)),
			(0xfd, Value::String("test1".to_owned()))
		
		]
    	.iter().cloned().collect();
	assert_eq!(decoded[0],  Message::Request(OperationRequest { code: 1, parameters}));
}

#[test]
fn test_response_message()
{
	let payload = vec![
		0x00, 0x00, 
		0x00, 
		0x02, 
		0x72, 0xea, 0x1d, 0x6a, 
		0x11, 0x63, 0x88, 0x88, 
		
		0x01, 
		0x00, 
		0x00, 
		0x00, 
		0x00, 0x00, 0x00, 0x14, 
		0x00, 0x00, 0x00, 0x00, 
		0x00, 0x00, 0x00, 0x24, 0x00, 0x04, 0xd7, 0x1a, 
		
		0x06, 
		0x00, 
		0x01, 
		0x00, 
		0x00, 0x00, 0x00, 0xb2, 
		0x00, 0x00, 0x17, 0x71, 
		0xf3, 0x03, 0x01, 0x00, 0x00, 0x2a, 0x00, 0xa, 0x00, 0x69, 0x18, 0xf2, 0x79, 0x68, 0x01, 0x73, 0x00, 0x5d, 0x40, 0x49, 0x53, 0x4c, 0x41, 0x4e, 0x44, 0x40, 0x65, 0x66, 0x33, 0x37, 0x39, 0x34, 0x64, 0x61, 0x2d, 0x38, 0x66, 0x38, 0x33, 0x2d, 0x34, 0x33, 0x34, 0x30, 0x2d, 0x62, 0x66, 0x35, 0x32, 0x2d, 0x36, 0x38, 0x31, 0x31, 0x37, 0x61, 0x30, 0x36, 0x37, 0x32, 0x65, 0x34, 0x7c, 0x57, 0x65, 0x64, 0x72, 0x6f, 0x77, 0x79, 0x63, 0x7a, 0x4a, 0x61, 0x6b, 0x75, 0x62, 0x7c, 0x36, 0x33, 0x37, 0x30, 0x37, 0x35, 0x33, 0x37, 0x38, 0x38, 0x30, 0x33, 0x31, 0x38, 0x33, 0x39, 0x33, 0x35, 0x7c, 0x57, 0x65, 0x64, 0x72, 0x6f, 0x77, 0x79, 0x63, 0x7a, 0x4a, 0x61, 0x6b, 0x75, 0x62, 0x02, 0x79, 0x00, 0x00, 0x78, 0x03, 0x79, 0x00, 0x00, 0x73, 0x04, 0x79, 0x00, 0x00, 0x73, 0x05, 0x78, 0x00, 0x00, 0x00, 0x00, 0x06, 0x79, 0x00, 0x01, 0x79, 0x00, 0x01, 0x69, 0xff, 0xff, 0xff, 0xff, 	0x07, 0x79, 0x00, 0x01, 0x79, 0x00, 0x01, 0x69, 0xff, 0xff, 0xff, 0xff, 0x08, 0x78, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x6b, 0x00, 0xa6
	];

    let mut photon = photon_decode::Photon::new();

    let decoded = photon.decode(&payload);

	assert_eq!(decoded.len(), 1);
	let parameters: Parameters =
		[
			(0x00, Value::Integer(418543976)),
			(0x01, Value::String("@ISLAND@ef3794da-8f83-4340-bf52-68117a0672e4|WedrowyczJakub|637075378803183935|WedrowyczJakub".to_owned())),
			(0x02, Value::Array(vec![])),
			(0x03, Value::Array(vec![])),
			(0x04, Value::Array(vec![])),
			(0x05, Value::ByteArray(vec![])),
			(0x06, Value::Array(vec![Value::Array(vec![Value::Integer(4294967295)])])),
			(0x07, Value::Array(vec![Value::Array(vec![Value::Integer(4294967295)])])),
			(0x08, Value::ByteArray(vec![])),
			(0xFD, Value::Short(166)),
		]
    	.iter().cloned().collect();
	assert_eq!(decoded[0],  Message::Response(OperationResponse { code: 1, return_code: 0, debug_message: "None".to_owned(), parameters}));
}

#[test]
fn test_example(){
	use photon_decode::{Photon, Message};

	let mut photon = Photon::new();
    let photon_packet = vec![
		0x00, 0x01, 			// PeerID
		0x01,                   // CrcEnabled
		0x00,                   // CommandCount
		0x00, 0x00, 0x00, 0x01, // Timestamp
		0x00, 0x00, 0x00, 0x01, // Challenge
    ];

	for message in photon.decode(&photon_packet).iter() {
		match message {
			Message::Event(_) => {
				// use event
			},
			Message::Request(_) => {
				// use request
			},
			Message::Response(_) => {
				// use response
			}
		}
	}
}