diff options
-rw-r--r-- | users/Profpatsch/netencode/README.md | 6 | ||||
-rw-r--r-- | users/Profpatsch/netencode/netencode.rs | 8 |
2 files changed, 8 insertions, 6 deletions
diff --git a/users/Profpatsch/netencode/README.md b/users/Profpatsch/netencode/README.md index 67cb843a58c7..8dc39f633761 100644 --- a/users/Profpatsch/netencode/README.md +++ b/users/Profpatsch/netencode/README.md @@ -73,7 +73,11 @@ A tag (`<`) gives a value a name. The tag is UTF-8 encoded, starting with its le ### records (products/records), also maps A record (`{`) is a concatenation of tags (`<`). It needs to be closed with `}`. -If tag names repeat the later ones should be ignored. Ordering does not matter. + +If tag names repeat the *earlier* ones should be ignored. +Using the last tag corresponds with the way most languages handle converting a list of tuples to Maps, by using a for-loop and Map.insert without checking the contents first. Otherwise you’d have to revert the list first or remember which keys you already inserted. + +Ordering of tags in a record does not matter. Similar to text, records start with the length of their *whole encoded content*, in bytes. This makes it possible to treat their contents as opaque bytestrings. diff --git a/users/Profpatsch/netencode/netencode.rs b/users/Profpatsch/netencode/netencode.rs index 0d92cf1ed4ae..bb08dca4aa57 100644 --- a/users/Profpatsch/netencode/netencode.rs +++ b/users/Profpatsch/netencode/netencode.rs @@ -405,11 +405,9 @@ pub mod parse { inner_no_empty_string(tag_g(&inner)), HashMap::new(), |mut acc: HashMap<_, _>, Tag { tag, mut val }| { - // ignore duplicated tag names that appear later + // ignore earlier tags with the same name // according to netencode spec - if !acc.contains_key(tag) { - acc.insert(tag, *val); - } + let _ = acc.insert(tag, *val); acc }, ), @@ -633,7 +631,7 @@ pub mod parse { record_t("{25:<1:a|u,<1:b|u,<1:a|i1:-1,}".as_bytes()), Ok(( "".as_bytes(), - vec![("a".to_owned(), T::Unit), ("b".to_owned(), T::Unit),] + vec![("a".to_owned(), T::I3(-1)), ("b".to_owned(), T::Unit),] .into_iter() .collect::<HashMap<_, _>>() )), |