I have spent the last couple of evenings learning about Rust and trying it out. Wrote a simple cli calculator as a first thing and thought I would improve it by making it available over http.
I was actually a bit surprised to find that there was no http tooling in the standard library, and searching online gave me an overload of information on different libraries and frameworks.
I ended up implementing my own simple HTTP server, might as well as this is a learning project.
Now I have it working, and while it isn't perfect or done, I thought that this would be a good time to check what things I am doing wrong/badly.
Which is why I am here, would love to get some pointers on it all to make sure I am going in the right direction in the future.
Use Option::ok_or_else() and Result::map_err() instead of let .. else.
let .. else didn't always exist. And you might find that some old timers are slightly triggered by it.
Functional style is generally preferred, as long as it doesn't effectively become a code obfuscater, like over-using Options as iterators (yes Options are iterators).
(Borken sanitization will probably butcher this code, good thing the problem will be gone in Lemmy 0.19)
Three tips here:
You don't need to annotate the type here because it can be inferred since headers will be returned as a struct field, the type of which is already known.
In this pattern, you should know that you can provide the collected type as a generic param to collect() itself. That may prove useful in other scenarios.
You should know that you can collect to a Result/Option if the iterator items are Results/Options. So that .unwrap() is not an ergonomic necessity 😉
Minor point
Use .into() or .to_owned() for &str => String conversions.
Again, some pre-specialization old timers may get slightly triggered by it.
make good use of the crate echo system
It's important to make good use of the crate echo system, and talking to people is important in doing that correctly and efficiently.
This post is a good start.
More specifically, the http crate is the compatibility layer used HTTP rust implementations. Check it out and maybe incorporate it into your
experimental/educational code.