If you follow semantic versioning rules (https://semver.org/) there is actual semantic difference between major version 0 and major version 1 and above.
A bit ballsy to release the 1.0.0 version immediately, isn’t it? :)
Other than that, kudos for sharing with the world, surely it will come useful for someone. Hell, I might even use it for things like host maintenance cronjobs instead of lock files.
Rust Error Handling and Rust in General is still a big black box for me yet to be unveiled :D
Conceptually, error handling in Rust is incredibly simple: if a function can fail, its return type is an enum of either the result of the function (in case of success) or a description of the error that happened. This enum is called Result. See:
You don't. You can 100% handle errors without any additional dependencies, and probably you should be doing that in the beginning. The crates simply add a little bit of syntactic sugar to simplify some boilerplate that you'll have to start writing as soon as your error handling gets sufficiently complex.
Not saying that your return type is bad, but in general you might be interested in crates thiserror and anyhow that simplify error handling.
51 .timeout(Duration::new(60, 0))
Duration::from_mins(1) would be much more readable.
66 panic!("{}", err);
You should almost never panic. Your function already returns a Result<>, so you should be using that for error handling.
70 } else {
71 // HTTP Status is not 200
Not Rust specific, but usually I recommend to handle errors first, and return from the function early. This way you reduce cognitive load on the reader, and reduce nesting of if-blocks.
150 let mut parts = line.splitn(2, '\t');
There's a convenient method to split in two substrings that you could have used:
let (mac_address, vendor_organization) = line.split_once('\t').unwrap_or(("", ""));
Computer science is just mathematics, you can do it with pen and paper. The actual IT jobs where you don't have to touch windows are plentiful, although it might be a bit of a red flag if you're vehemently refusing to touch some specific software (be it windows, or any other program, or programming language).
Interestingly, Rust is what brought me to this rabbit hole. It does indeed panic in now()[1], but the devs seem to be reluctant to provide the try_now() variant[2].
Oh yeah, for sure. I just teel that I personally would never dare to release the first version of a library as 1.0.