I want to have a function inside generic which can have Default member like this:
use std::default::Default;
use serde::Serialize;
#[derive(Debug, Serialize, Deserialize)]
pub struct DefaultBody {
pub content: String,
}
impl Default for DefaultBody {
fn default() -> DefaultBody {
DefaultBody {
content: "Insert content here...".to_string()
}
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct DefaultHeader {
pub title: String,
}
impl Default for DefaultHeader {
fn default() -> DefaultHeader {
DefaultHeader {
title: "Insert header here...".to_string(),
}
}
}
pub type DefaultViewModel<'h, 'b> = ViewModel<'h, 'b, DefaultHeader, DefaultBody>;
pub type DefaultHeaderViewModel<'h, 'b, B> = ViewModel<'h, 'b, DefaultHeader, B>;
pub type DefaultBodyViewModel<'h, 'b, H> = ViewModel<'h, 'b, H, DefaultBody>;
#[derive(Debug, Serialize)]
pub struct ViewModel<'h, 'b, H: 'h, B: 'b>
where
H: Serialize + 'h,
B: Serialize + 'b,
{
pub header: &'h H,
pub body: &'b B,
}
impl<'h, 'b, H, B> ViewModel<'h, 'b, H, B>
where
H: Serialize + 'h,
B: Serialize + 'b,
{
pub fn new(header: &'h H, body: &'b B) -> ViewModel<'h, 'b, H, B> {
ViewModel { header, body }
}
pub fn with_default_header(body: &'b B) -> DefaultHeaderViewModel<B> {
let h: DefaultHeader = Default::default();
ViewModel {
header: &h,
body,
}
}
pub fn with_default_body(header: &'h H) -> DefaultBodyViewModel<H> {
let b: DefaultBody = Default::default();
ViewModel {
header,
body: &b,
}
}
}
impl<'h, 'b, H, B> Default for ViewModel<'h, 'b, H, B>
where
H: Serialize + Default + 'h,
B: Serialize + Default + 'b,
{
fn default() -> ViewModel<'h, 'b, H, B> {
let h: H = Default::default();
let b: B = Default::default();
ViewModel::new(&h, &b)
}
}
And I got this error:
error[E0597]: `h` does not live long enough
--> server/src/view_models/mod.rs:61:22
|
61 | header: &h,
| ^ borrowed value does not live long enough
...
64 | }
| - borrowed value only lives until here
I know the borrowed value doesn't live long enough, but is there a workaround to initialize something like this?