Dolphin
Dolphin

Reputation: 38759

how to define multi parameter with from function in rust

Now I want to map object from Favorites to FavMusicResponse, the Favorites object was selected from database and the FavMusicResponse entity was return to the client. I define the map function like this way in FavMusicResponse:

impl From<&Favorites> for FavMusicResponse {
    fn from(f: &Favorites, music: Music) -> Self {
        Self{
            id: f.id,
            song_id: None,
            created_time: f.created_time,
            updated_time: f.updated_time,
            user_id: 0,
            source_id: "".to_string(),
            like_status: 0,
            source: 0,
            playlist_id: 0,
            play_count: 0,
            fetched_download_url: None,
            downloaded: None,
            music: Default::default()
        }
    }
}

most of the fields from Favorites fields are the same with FavMusicResponse, the only difference is that music was passed from another entity. This is my FavMusicResponse define:

#[derive( Serialize, Queryable, Deserialize,Default, Clone)]
pub struct FavMusicResponse{
    pub id: i64,
    pub song_id: Option<i64>,
    pub created_time: i64,
    pub updated_time: i64,
    pub user_id: i64,
    pub source_id: String,
    pub like_status: i32,
    pub source: i32,
    pub playlist_id: i64,
    pub play_count: i32,
    pub fetched_download_url: Option<i32>,
    pub downloaded: Option<i32>,
    pub music: Music
}

the compiler tell me that from expected 1 parameter, found 2, what should I do do pass 2 or more parameter into the composite function in rust? I invoke the function like this way:

let filtered_music:Vec<_> = musics.iter()
            .filter(|item| item.source_id == fav.source_id)
            .map(|item|FavMusicResponse::from(fav,item.clone()))
            .collect();

I want to passed two entity and composite to the finally FavMusicResponse entity. what should I do to make it work like that? This is my minimal reproduce that could run in rust playground to figure out where is going wrong:

fn main() {
    let music = Music{
        id: 1
    };
    let favMusic = Favorites{
        id: 1
    };
    let musicRes = FavMusicResponse::from(favMusic,music);
}

pub struct Music {
    pub id: i64
}

pub struct Favorites {
    pub id: i64
}

pub struct FavMusicResponse {
    pub id: i64,
    pub music:Music
}


impl From<Favorites> for FavMusicResponse {
    fn from(f: Favorites, music: Music) -> Self {
        Self{
            id: f.id,
            music: music
        }
    }
}

Upvotes: 0

Views: 67

Answers (1)

Stargateur
Stargateur

Reputation: 26727

From trait can't take two parameters only one, it's define that way, the only solution if you really want to use From trait is to transform your two parameter into one, a quick solution is to use a tuple:

impl From<(Favorites, Music)> for FavMusicResponse {
    fn from((f, music): (Favorites, Music)) -> Self {
        Self {
            id: f.id,
            music,
        }
    }
}

// let musicRes = FavMusicResponse::from((favMusic, music));

That said you could also just have a new() method on your type:

impl FavMusicResponse {
    fn new(f: Favorites, music: Music) -> Self {
        Self {
            id: f.id,
            music,
        }
    }
}

// let musicRes = FavMusicResponse::new(favMusic, music);

Upvotes: 2

Related Questions