Don't look at this before you've completed the challenge! This is not the only correct solution, just one example. I have notated the solution with comments beginning with NORA to help explain my reasoning and the purpose of each line. |
||
|---|---|---|
| src | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| README.md | ||
README.md
Rust Tokens Coding Challenge
This coding challenge presents a tokenization/parsing scenario in which some external system is accepting bytes in discrete packets representing a stream.
You will solve the challenge by modifying the method process of the struct Parser, without changing its function signature or the signature of the constructor, new. You can, however, modify the struct Parser itself however you feel is necessary.
Packetization
These packets aren't consistent in their size or contents, so the stream
"I am a stream of packets; synthesize me." could just as easily be
"I am ", "a stream ", "of packets; ", "synthesize me.",
one packet per character ("I", " ", "a", "m", ...), or just one packet
containing the entire input.
Input and Output
Your task is to implement a struct, called Parser, whose process method
adds a suffix after certain words. So, for instance, if given the token "foo" and the suffix "bar", your Parser would take the following input:
"Does this foo look like a fooing bar to you?"
and return this output:
"Does this foobar look like a foobaring bar to you?"
This needs to work over the full range of possible packetizations, from one packet for the whole input to one packet per character.
Mechanics of I/O
The process function takes a mutable reference to the Parser (so you can
add some state into the Parser if you want),
a chunk of bytes to process,
and a &mut dyn Write sink for the output.
If you're not familiar with the Write trait, it's worth looking into.
The gist, however, is that you can send a buffer (like a &[u8]) to the
Writer with its write_all method.
This is actually what the default implementation of process does, as provided by the challenge, which is of course not a correct solution - but it does pass half of the tests!
Non-functional Requirements
There are no constraints on speed, memory usage, or binary size. Go wild.
This Repo
This Git repo has just two commits, on the branches challenge (and main) and solution.
Don't look at solution until you've solved the challenge!