Return Generic Type in Rust
Background: I have a large serde_json value that I want to be read-only (the authoritative source is an encrypted SQLite DB and should only be updated when that gets updated)
The issue, I would like a single get function that returns a generic type
<span style="font-weight:bold;color:#a71d5d;">use</span><span style="color:#323232;"> serde_json;
</span><span style="color:#323232;">
</span><span style="font-weight:bold;color:#a71d5d;">pub struct </span><span style="color:#323232;">Configuration {
</span><span style="color:#323232;"> config: serde_json::Value,
</span><span style="color:#323232;">}
</span><span style="color:#323232;">
</span><span style="font-weight:bold;color:#a71d5d;">impl </span><span style="color:#323232;">Configuration {
</span><span style="color:#323232;"> async </span><span style="font-weight:bold;color:#a71d5d;">fn </span><span style="font-weight:bold;color:#795da3;">get</span><span style="color:#323232;">(</span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">amp;self, key: </span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">amp;</span><span style="font-weight:bold;color:#a71d5d;">str</span><span style="color:#323232;">) -> Result {
</span><span style="color:#323232;"> </span><span style="font-weight:bold;color:#a71d5d;">let</span><span style="color:#323232;"> tmp_value: </span><span style="font-weight:bold;color:#a71d5d;">= &</span><span style="color:#323232;">amp;self.config[</span><span style="color:#183691;">"test"</span><span style="color:#323232;">];
</span><span style="color:#323232;">
</span><span style="color:#323232;"> </span><span style="font-style:italic;color:#969896;">// This would be repeated for String, bool, etc
</span><span style="color:#323232;"> </span><span style="font-weight:bold;color:#a71d5d;">if</span><span style="color:#323232;"> tmp_value.</span><span style="color:#62a35c;">is_i64</span><span style="color:#323232;">() {
</span><span style="color:#323232;"> </span><span style="font-weight:bold;color:#a71d5d;">match</span><span style="color:#323232;"> tmp_value.as_i64 {
</span><span style="color:#323232;"> </span><span style="color:#0086b3;">Some</span><span style="color:#323232;">(x) </span><span style="font-weight:bold;color:#a71d5d;">=> </span><span style="color:#0086b3;">Ok</span><span style="color:#323232;">(x),
</span><span style="color:#323232;"> </span><span style="color:#0086b3;">Err</span><span style="color:#323232;">(e) </span><span style="font-weight:bold;color:#a71d5d;">=> </span><span style="color:#0086b3;">Err</span><span style="color:#323232;">(()),
</span><span style="color:#323232;"> }
</span><span style="color:#323232;"> } </span><span style="font-weight:bold;color:#a71d5d;">else </span><span style="color:#323232;">{
</span><span style="color:#323232;"> </span><span style="color:#0086b3;">Err</span><span style="color:#323232;">(())
</span><span style="color:#323232;"> }
</span><span style="color:#323232;"> }
</span><span style="color:#323232;">}
</span>
However I get: “mismatched types expected type parameter T found type i64”
Is it even possible to return multiple types from a single function?
EDIT: SOLUTION
Here is the solution I came up with:
<span style="font-weight:bold;color:#a71d5d;">pub struct </span><span style="color:#323232;">Configuration {}
</span><span style="color:#323232;">
</span><span style="font-weight:bold;color:#a71d5d;">impl </span><span style="color:#323232;">Configuration {
</span><span style="color:#323232;"> </span><span style="font-weight:bold;color:#a71d5d;">fn </span><span style="font-weight:bold;color:#795da3;">get </span><span style="color:#323232;">std::str::FromStr</span><span style="font-weight:bold;color:#a71d5d;">></span><span style="color:#323232;">() -> Result {
</span><span style="color:#323232;"> </span><span style="color:#0086b3;">Ok</span><span style="color:#323232;">(T::from_str(</span><span style="color:#183691;">"1234"</span><span style="color:#323232;">);
</span><span style="color:#323232;"> }
</span><span style="color:#323232;">}
</span><span style="color:#323232;">
</span><span style="font-weight:bold;color:#a71d5d;">fn </span><span style="font-weight:bold;color:#795da3;">main</span><span style="color:#323232;">() {
</span><span style="color:#323232;"> </span><span style="font-weight:bold;color:#a71d5d;">let</span><span style="color:#323232;"> my_conf_val </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#323232;">Configuration::get();
</span><span style="color:#323232;">}
</span>
Add comment