Решение на Network Packets от Людмил Данаилов

Обратно към всички решения

Към профила на Людмил Данаилов

Резултати

  • 1 точка от тестове
  • 0 бонус точки
  • 1 точка общо
  • 1 успешни тест(а)
  • 14 неуспешни тест(а)

Код

use std::fmt;
use std::str;
#[derive(Debug)]
pub enum PacketError {
InvalidPacket,
InvalidChecksum,
UnknownProtocolVersion,
CorruptedMessage,
}
impl fmt::Display for PacketError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", "Error")
}
}
impl std::error::Error for PacketError {}
#[derive(PartialEq, Debug)]
pub struct Packet {
payload: String,
length: u8
}
impl Packet {
pub fn from_source(source: &[u8], size: u8) -> (Self, &[u8]) {
// let mut payload = str::from_utf8(source).unwrap().to_string();
// let mut rem = String::from("");
// for _i in 1..(payload.len() - size as usize){
// rem.push(payload.pop().unwrap());
// }
// let packet = Packet {payload: payload, length: size};
// return (packet, &rem.into_bytes())
// Do not understand, why this doesn't work
unimplemented!()
}

Като за начало, няма нужда да ползваш str::from_utf8, последвано от .to_string(), има си String::from_utf8. Иначе, няма причина да конвертираш байтовете до низ -- ако искахме пакетите да са само utf8-валидни низове, щяхме да очакваме source да е низ. Пакета може да обхваща всякакъв комплект от байтове, не задължително валиден низ.

Оттам нататък, не ми е съвсем ясно какво се опитваш да направиш. Почваш да броиш от 1 до payload.len() - size, но защо? Изглежда първо искаш да събереш остатъка, а после да сложиш payload-а, което е малко наобратно.

Не знам какво значи "doesn't work" оттук нататък, може би не се е компилирал кода или тестовете са гърмели? Но прегледай останалите решения, примерно моето, и се опитай да разбереш кода, може би и да си имплементираш собствено решение за упражнение.

pub fn payload(&self) -> &[u8] {
unimplemented!()
}
pub fn serialize(&self) -> Vec<u8> {
unimplemented!()
}
pub fn deserialize(bytes: &[u8]) -> Result<(Packet, &[u8]), PacketError> {
unimplemented!()
}
}
pub struct PacketSerializer {
// ...
}
impl Iterator for PacketSerializer {
type Item = Packet;
fn next(&mut self) -> Option<Self::Item> {
unimplemented!()
}
}
pub trait Packetable: Sized {
fn to_packets(&self, packet_size: u8) -> PacketSerializer;
fn to_packet_data(&self, packet_size: u8) -> Vec<u8>;
fn from_packet_data(packet_data: &[u8]) -> Result<Self, PacketError>;
}
impl Packetable for String {
fn to_packets(&self, packet_size: u8) -> PacketSerializer {
unimplemented!()
}
fn to_packet_data(&self, packet_size: u8) -> Vec<u8> {
unimplemented!()
}
fn from_packet_data(packet_data: &[u8]) -> Result<Self, PacketError> {
unimplemented!()
}
}

Лог от изпълнението

Compiling solution v0.1.0 (/tmp/d20200111-2173579-1t1pumg/solution)
warning: unused import: `std::str`
 --> src/lib.rs:2:5
  |
2 | use std::str;
  |     ^^^^^^^^
  |
  = note: `#[warn(unused_imports)]` on by default

warning: unused variable: `source`
  --> src/lib.rs:27:24
   |
27 |     pub fn from_source(source: &[u8], size: u8) -> (Self, &[u8]) {
   |                        ^^^^^^ help: consider prefixing with an underscore: `_source`
   |
   = note: `#[warn(unused_variables)]` on by default

warning: unused variable: `size`
  --> src/lib.rs:27:39
   |
27 |     pub fn from_source(source: &[u8], size: u8) -> (Self, &[u8]) {
   |                                       ^^^^ help: consider prefixing with an underscore: `_size`

warning: unused variable: `bytes`
  --> src/lib.rs:47:24
   |
47 |     pub fn deserialize(bytes: &[u8]) -> Result<(Packet, &[u8]), PacketError> {
   |                        ^^^^^ help: consider prefixing with an underscore: `_bytes`

warning: unused variable: `packet_size`
  --> src/lib.rs:71:26
   |
71 |     fn to_packets(&self, packet_size: u8) -> PacketSerializer {
   |                          ^^^^^^^^^^^ help: consider prefixing with an underscore: `_packet_size`

warning: unused variable: `packet_size`
  --> src/lib.rs:75:30
   |
75 |     fn to_packet_data(&self, packet_size: u8) -> Vec<u8> {
   |                              ^^^^^^^^^^^ help: consider prefixing with an underscore: `_packet_size`

warning: unused variable: `packet_data`
  --> src/lib.rs:79:25
   |
79 |     fn from_packet_data(packet_data: &[u8]) -> Result<Self, PacketError> {
   |                         ^^^^^^^^^^^ help: consider prefixing with an underscore: `_packet_data`

warning: unused import: `std::str`
 --> src/lib.rs:2:5
  |
2 | use std::str;
  |     ^^^^^^^^
  |
  = note: `#[warn(unused_imports)]` on by default

warning: unused variable: `source`
  --> src/lib.rs:27:24
   |
27 |     pub fn from_source(source: &[u8], size: u8) -> (Self, &[u8]) {
   |                        ^^^^^^ help: consider prefixing with an underscore: `_source`
   |
   = note: `#[warn(unused_variables)]` on by default

warning: unused variable: `size`
  --> src/lib.rs:27:39
   |
27 |     pub fn from_source(source: &[u8], size: u8) -> (Self, &[u8]) {
   |                                       ^^^^ help: consider prefixing with an underscore: `_size`

warning: unused variable: `bytes`
  --> src/lib.rs:47:24
   |
47 |     pub fn deserialize(bytes: &[u8]) -> Result<(Packet, &[u8]), PacketError> {
   |                        ^^^^^ help: consider prefixing with an underscore: `_bytes`

warning: unused variable: `packet_size`
  --> src/lib.rs:71:26
   |
71 |     fn to_packets(&self, packet_size: u8) -> PacketSerializer {
   |                          ^^^^^^^^^^^ help: consider prefixing with an underscore: `_packet_size`

warning: unused variable: `packet_size`
  --> src/lib.rs:75:30
   |
75 |     fn to_packet_data(&self, packet_size: u8) -> Vec<u8> {
   |                              ^^^^^^^^^^^ help: consider prefixing with an underscore: `_packet_size`

warning: unused variable: `packet_data`
  --> src/lib.rs:79:25
   |
79 |     fn from_packet_data(packet_data: &[u8]) -> Result<Self, PacketError> {
   |                         ^^^^^^^^^^^ help: consider prefixing with an underscore: `_packet_data`

    Finished test [unoptimized + debuginfo] target(s) in 3.42s
     Running target/debug/deps/solution-a73e64ec87929bd0

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

     Running target/debug/deps/solution_test-38971695424b36d5

running 15 tests
test solution_test::test_construct_packet_from_unicode ... FAILED
test solution_test::test_construct_packet_no_remainder ... FAILED
test solution_test::test_construct_packet_with_remainder ... FAILED
test solution_test::test_construct_packet_with_remainder_cyrillic ... FAILED
test solution_test::test_consuming_packets ... thread '<unnamed>' panicked at 'not yet implemented', src/lib.rs:72:9
FAILED
test solution_test::test_deserialize_invalid_packet ... FAILED
test solution_test::test_deserialize_packet ... FAILED
test solution_test::test_deserialize_unicode_packet ... FAILED
test solution_test::test_full_roundtrip ... thread '<unnamed>' panicked at 'not yet implemented', src/lib.rs:76:9
FAILED
test solution_test::test_full_roundtrip_for_zero_size_string ... thread '<unnamed>' panicked at 'not yet implemented', src/lib.rs:76:9
FAILED
test solution_test::test_invalid_packet_combination ... thread '<unnamed>' panicked at 'not yet implemented', src/lib.rs:72:9
FAILED
test solution_test::test_iterating_packets ... thread '<unnamed>' panicked at 'not yet implemented', src/lib.rs:72:9
FAILED
test solution_test::test_iterating_packets_for_zero_size_string ... thread '<unnamed>' panicked at 'not yet implemented', src/lib.rs:72:9
FAILED
test solution_test::test_serialize_packet ... FAILED
test solution_test::test_zero_size ... ok

failures:

---- solution_test::test_construct_packet_from_unicode stdout ----
thread 'main' panicked at 'not yet implemented', src/lib.rs:36:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.

---- solution_test::test_construct_packet_no_remainder stdout ----
thread 'main' panicked at 'not yet implemented', src/lib.rs:36:9

---- solution_test::test_construct_packet_with_remainder stdout ----
thread 'main' panicked at 'not yet implemented', src/lib.rs:36:9

---- solution_test::test_construct_packet_with_remainder_cyrillic stdout ----
thread 'main' panicked at 'not yet implemented', src/lib.rs:36:9

---- solution_test::test_consuming_packets stdout ----
thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', src/libcore/option.rs:378:21

---- solution_test::test_deserialize_invalid_packet stdout ----
thread 'main' panicked at 'not yet implemented', src/lib.rs:48:9

---- solution_test::test_deserialize_packet stdout ----
thread 'main' panicked at 'not yet implemented', src/lib.rs:36:9

---- solution_test::test_deserialize_unicode_packet stdout ----
thread 'main' panicked at 'not yet implemented', src/lib.rs:36:9

---- solution_test::test_full_roundtrip stdout ----
thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', src/libcore/option.rs:378:21

---- solution_test::test_full_roundtrip_for_zero_size_string stdout ----
thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', src/libcore/option.rs:378:21

---- solution_test::test_invalid_packet_combination stdout ----
thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', src/libcore/option.rs:378:21

---- solution_test::test_iterating_packets stdout ----
thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', src/libcore/option.rs:378:21

---- solution_test::test_iterating_packets_for_zero_size_string stdout ----
thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', src/libcore/option.rs:378:21

---- solution_test::test_serialize_packet stdout ----
thread 'main' panicked at 'not yet implemented', src/lib.rs:36:9


failures:
    solution_test::test_construct_packet_from_unicode
    solution_test::test_construct_packet_no_remainder
    solution_test::test_construct_packet_with_remainder
    solution_test::test_construct_packet_with_remainder_cyrillic
    solution_test::test_consuming_packets
    solution_test::test_deserialize_invalid_packet
    solution_test::test_deserialize_packet
    solution_test::test_deserialize_unicode_packet
    solution_test::test_full_roundtrip
    solution_test::test_full_roundtrip_for_zero_size_string
    solution_test::test_invalid_packet_combination
    solution_test::test_iterating_packets
    solution_test::test_iterating_packets_for_zero_size_string
    solution_test::test_serialize_packet

test result: FAILED. 1 passed; 14 failed; 0 ignored; 0 measured; 0 filtered out

error: test failed, to rerun pass '--test solution_test'

История (1 версия и 1 коментар)

Людмил качи първо решение на 03.12.2019 16:47 (преди почти 6 години)