A Rust API Inspired by Python, Powered by Serde
ohadravid.github.io
A Rust API Inspired by Python, Powered by Serde
1–10 of 27 posts
Re: A Rust API Inspired by Python, Powered by Serde
#2This is also a deep dive into Serde internals - hope you'll like it!
Re: A Rust API Inspired by Python, Powered by Serde
#3 let res = raw_api::query("SELECT * FROM Win32_Fan");
for obj in res {
if obj.get_attr("ActiveCooling") == Value::Bool(true) {
if let Value::String(name) = obj.get_attr("Name") {
if let Value::UI8(speed) = obj.get_attr("DesiredSpeed") {
println!("Fan `{name}` is running at {speed} RPM");
}
}
}
}
If actually concerned about the need to know UI8, then create a typedef DesiredSpeedT or similar. This is equivalent to the struct Fan.Edit: I understand the post is probably more of a playful exercise than anything else, but I really think the original is far far better (smaller, simpler, etc.) and hope that is not lost on people.
Re: A Rust API Inspired by Python, Powered by Serde
#4Pardon me, but I prefer the original by 1 million miles. let res = raw_api::query("SELECT * FROM Win32_Fan"); for obj in res { if obj.get_attr("ActiveCooling") == Value::Bool(true) { if let Value::String(name) = obj.get_attr("Name") { if let Value::UI8(speed) = obj.get_attr("DesiredSpeed") { println!("Fan `{name}` is running at {speed} RPM"); } } } } If actually concerned about the need to know UI8, then create a typ…
There's also an Alternatives section in the article about other approaches that can achieve similar results, but of course 'do nothing' is also a valid option.
Edit: > If actually concerned about the need to know UI8 ..
Just a small note: even if you don't care about the fact that it's a UI8, you still have to use the correct type. For example, if the field happens to be returned as UI4, this code won't work!
Re: A Rust API Inspired by Python, Powered by Serde
#5Pardon me, but I prefer the original by 1 million miles. let res = raw_api::query("SELECT * FROM Win32_Fan"); for obj in res { if obj.get_attr("ActiveCooling") == Value::Bool(true) { if let Value::String(name) = obj.get_attr("Name") { if let Value::UI8(speed) = obj.get_attr("DesiredSpeed") { println!("Fan `{name}` is running at {speed} RPM"); } } } } If actually concerned about the need to know UI8, then create a typ…
That's understandable, but I think it depends on how many different structs like this you have and how many fields you need to work with (for our usecase, we had tens of structs with tens of fields each). There's also an Alternatives section in the article about other approaches that can achieve similar results, but of course 'do nothing' is also a valid option. Edit: > If actually concerned about the need to know UI…
Regarding the UI8, don't you have to get your version's struct data member type correct to the exact same degree as a typedef in my suggestion?
Re: A Rust API Inspired by Python, Powered by Serde
#6 for fan in c.query("SELECT * FROM Win32_Fan"):
if fan.wmi_property("ActiveCooling").value is True:
print(f"Fan `{fan.wmi_property('Name').value}` is running at {fan.wmi_property('DesiredSpeed').value} RPM")
vs "SELECT Name, DesiredSpeed from Win32_Fan where ActiveCooling"Obviously, this doesn't matter when you have 5 fans, but in general, you want to push your restrictions as deeply into the query as possible from an optimization standpoint.
Re: A Rust API Inspired by Python, Powered by Serde
#7Earlier quoted context omitted.
That's understandable, but I think it depends on how many different structs like this you have and how many fields you need to work with (for our usecase, we had tens of structs with tens of fields each). There's also an Alternatives section in the article about other approaches that can achieve similar results, but of course 'do nothing' is also a valid option. Edit: > If actually concerned about the need to know UI…
Right, but isn't the struct definition equivalent in line count and effort compared to some typedefs and perhaps a handful of trivial-to-inspect oneline helper functions? Regarding the UI8, don't you have to get your version's struct data member type correct to the exact same degree as a typedef in my suggestion?
No, since Serde will happyly fill a `u64` field with any other `u{8,16,32}` value, and even with signed types (as long as the actual value is non-negative) - this is sort of what happens when you deserialize a JSON `[1, 2, 3]` into `[u64]`.
Re: A Rust API Inspired by Python, Powered by Serde
#8This kind of sells the reason not to wrap things behind an object interface, doesn't it? for fan in c.query("SELECT * FROM Win32_Fan"): if fan.wmi_property("ActiveCooling").value is True: print(f"Fan `{fan.wmi_property('Name').value}` is running at {fan.wmi_property('DesiredSpeed').value} RPM") vs "SELECT Name, DesiredSpeed from Win32_Fan where ActiveCooling" Obviously, this doesn't matter when you have 5 fans, but i…
Re: A Rust API Inspired by Python, Powered by Serde
#9Earlier quoted context omitted.
Right, but isn't the struct definition equivalent in line count and effort compared to some typedefs and perhaps a handful of trivial-to-inspect oneline helper functions? Regarding the UI8, don't you have to get your version's struct data member type correct to the exact same degree as a typedef in my suggestion?
> don't you have to get your version's struct data member type correct No, since Serde will happyly fill a `u64` field with any other `u{8,16,32}` value, and even with signed types (as long as the actual value is non-negative) - this is sort of what happens when you deserialize a JSON `[1, 2, 3]` into `[u64]`.
Re: A Rust API Inspired by Python, Powered by Serde
#10[1] https://github.com/facebookincubator/below/blob/main/below/b...