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

use serde_json;

pub struct Configuration {
    config: serde_json::Value,
}

impl Configuration {
    async fn get(&self, key: &str) -> Result {
        let tmp_value: = &self.config["test"];

        // This would be repeated for String, bool, etc
        if tmp_value.is_i64() {
            match tmp_value.as_i64 {
                Some(x) => Ok(x),
                Err(e) => Err(()),
            }
        } else {
            Err(())
        }
    }
}

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:

pub struct Configuration {}

impl Configuration {
    fn get std::str::FromStr>() -> Result {
        Ok(T::from_str("1234");
    }
}

fn main() {
    let my_conf_val = Configuration::get();
}
  • I_like_cats@lemmy.one
    link
    fedilink
    arrow-up
    3
    ·
    8 months ago

    No. You can only return a single type from the function. You could return the serde_json::Value though so that the code calling this function can get the value it needs itself

  • Turun@feddit.de
    link
    fedilink
    arrow-up
    3
    ·
    edit-2
    8 months ago

    I see two options immediately:

    Make the function generic and return result(T, err), where T is the generic typed supplied by the caller (turbo fish syntax). Not sure if it will compile though.

    Use whatever serve uses under the hood. They obviously have some way that allows them to return an arbitrary type. Alternatively implement it yourself by creating an enum that can be either string, int or bool. Will require matching by the caller after the function returns.

    I know in e.g. java you regularly do if x.instanceof(y), but rust lends itself really badly to this type of programming.

  • chrismit3s@feddit.de
    link
    fedilink
    arrow-up
    3
    ·
    8 months ago

    Well how do you want to use said get function?

    let x = config.get("key").await;
    

    So what type should x have?

  • wulf@lemmy.worldOP
    link
    fedilink
    arrow-up
    2
    ·
    8 months ago

    SOLUTION:

    Here is the solution I came up with:

    pub struct Configuration {}
    
    impl Configuration {
        fn get std::str::FromStr>() -> Result {
            Ok(T::from_str("1234");
        }
    }
    
    fn main() {
        let my_conf_val = Configuration::get();
    }