diff --git a/activitystreams-derive/src/lib.rs b/activitystreams-derive/src/lib.rs index a3929e5..6c0ab42 100644 --- a/activitystreams-derive/src/lib.rs +++ b/activitystreams-derive/src/lib.rs @@ -529,12 +529,13 @@ pub fn properties(tokens: TokenStream) -> TokenStream { if field.description.required { if field.description.functional { let set = quote! { - pub fn #set_ident(&mut self, item: T) -> &mut Self + pub fn #set_ident(&mut self, item: T) -> Result<&mut Self, >::Error> where - T: Into<#v_ty> + T: std::convert::TryInto<#v_ty>, { - self.#fname = item.into(); - self + use std::convert::TryInto; + self.#fname = item.try_into()?; + Ok(self) } }; @@ -550,12 +551,13 @@ pub fn properties(tokens: TokenStream) -> TokenStream { } } else { let set = quote! { - pub fn #set_ident(&mut self, item: T) -> &mut Self + pub fn #set_ident(&mut self, item: T) -> Result<&mut Self, >::Error> where - T: Into<#v_ty> + T: std::convert::TryInto<#v_ty>, { - self.#fname = #enum_ty::Term(item.into()); - self + use std::convert::TryInto; + self.#fname = #enum_ty::Term(item.try_into()?); + Ok(self) } }; @@ -569,13 +571,13 @@ pub fn properties(tokens: TokenStream) -> TokenStream { }; let set_many = quote! { - pub fn #set_many_ident(&mut self, item: Vec) -> &mut Self + pub fn #set_many_ident(&mut self, item: Vec) -> Result<&mut Self, >::Error> where - T: Into<#v_ty>, + T: std::convert::TryInto<#v_ty>, { - let item: Vec<#v_ty> = item.into_iter().map(Into::into).collect(); + let item: Vec<#v_ty> = item.into_iter().map(std::convert::TryInto::try_into).collect::, _>>()?; self.#fname = #enum_ty::Array(item); - self + Ok(self) } }; @@ -598,12 +600,13 @@ pub fn properties(tokens: TokenStream) -> TokenStream { } else { if field.description.functional { let set = quote! { - pub fn #set_ident(&mut self, item: T) -> &mut Self + pub fn #set_ident(&mut self, item: T) -> Result<&mut Self, >::Error> where - T: Into<#v_ty> + T: std::convert::TryInto<#v_ty>, { - self.#fname = Some(item.into()); - self + use std::convert::TryInto; + self.#fname = Some(item.try_into()?); + Ok(self) } }; @@ -619,12 +622,13 @@ pub fn properties(tokens: TokenStream) -> TokenStream { } } else { let set = quote! { - pub fn #set_ident(&mut self, item: T) -> &mut Self + pub fn #set_ident(&mut self, item: T) -> Result<&mut Self, >::Error> where - T: Into<#v_ty> + T: std::convert::TryInto<#v_ty>, { - self.#fname = Some(#enum_ty::Term(item.into())); - self + use std::convert::TryInto; + self.#fname = Some(#enum_ty::Term(item.try_into()?)); + Ok(self) } }; @@ -638,13 +642,13 @@ pub fn properties(tokens: TokenStream) -> TokenStream { }; let set_many = quote! { - pub fn #set_many_ident(&mut self, item: Vec) -> &mut Self + pub fn #set_many_ident(&mut self, item: Vec) -> Result<&mut Self, >::Error> where - T: Into<#v_ty>, + T: std::convert::TryInto<#v_ty>, { - let item: Vec<#v_ty> = item.into_iter().map(Into::into).collect(); + let item: Vec<#v_ty> = item.into_iter().map(std::convert::TryInto::try_into).collect::, _>>()?; self.#fname = Some(#enum_ty::Array(item)); - self + Ok(self) } }; @@ -678,13 +682,14 @@ pub fn properties(tokens: TokenStream) -> TokenStream { if field.description.required { let set = quote! { - pub fn #set_ident(&mut self, item: T) -> &mut Self + pub fn #set_ident(&mut self, item: T) -> Result<&mut Self, >::Error> where - T: Into<#v_ty>, + T: std::convert::TryInto<#v_ty>, { - let item: #v_ty = item.into(); + use std::convert::TryInto; + let item: #v_ty = item.try_into()?; self.#fname = item.into(); - self + Ok(self) } }; @@ -703,13 +708,14 @@ pub fn properties(tokens: TokenStream) -> TokenStream { } } else { let set = quote! { - pub fn #set_ident(&mut self, item: T) -> &mut Self + pub fn #set_ident(&mut self, item: T) -> Result<&mut Self, >::Error> where - T: Into<#v_ty>, + T: std::convert::TryInto<#v_ty>, { - let item: #v_ty = item.into(); + use std::convert::TryInto; + let item: #v_ty = item.try_into()?; self.#fname = Some(item.into()); - self + Ok(self) } }; @@ -752,14 +758,15 @@ pub fn properties(tokens: TokenStream) -> TokenStream { if field.description.required { let set = quote! { - pub fn #set_ident(&mut self, item: T) -> &mut Self + pub fn #set_ident(&mut self, item: T) -> Result<&mut Self, >::Error> where - T: Into<#v_ty>, + T: std::convert::TryInto<#v_ty>, { - let item: #v_ty = item.into(); + use std::convert::TryInto; + let item: #v_ty = item.try_into()?; let item: #term_ty = item.into(); self.#fname = item.into(); - self + Ok(self) } }; @@ -773,14 +780,14 @@ pub fn properties(tokens: TokenStream) -> TokenStream { }; let set_many = quote! { - pub fn #set_many_ident(&mut self, item: Vec) -> &mut Self + pub fn #set_many_ident(&mut self, item: Vec) -> Result<&mut Self, >::Error> where - T: Into<#v_ty>, + T: std::convert::TryInto<#v_ty>, { - let item: Vec<#v_ty> = item.into_iter().map(Into::into).collect(); + let item: Vec<#v_ty> = item.into_iter().map(std::convert::TryInto::try_into).collect::, _>>()?; let item: Vec<#term_ty> = item.into_iter().map(Into::into).collect(); self.#fname = item.into(); - self + Ok(self) } }; @@ -801,14 +808,15 @@ pub fn properties(tokens: TokenStream) -> TokenStream { } } else { let set = quote! { - pub fn #set_ident(&mut self, item: T) -> &mut Self + pub fn #set_ident(&mut self, item: T) -> Result<&mut Self, >::Error> where - T: Into<#v_ty>, + T: std::convert::TryInto<#v_ty>, { - let item: #v_ty = item.into(); + use std::convert::TryInto; + let item: #v_ty = item.try_into()?; let item: #term_ty = item.into(); self.#fname = Some(item.into()); - self + Ok(self) } }; @@ -822,14 +830,14 @@ pub fn properties(tokens: TokenStream) -> TokenStream { }; let set_many = quote! { - pub fn #set_many_ident(&mut self, item: Vec) -> &mut Self + pub fn #set_many_ident(&mut self, item: Vec) -> Result<&mut Self, >::Error> where - T: Into<#v_ty>, + T: std::convert::TryInto<#v_ty>, { - let item: Vec<#v_ty> = item.into_iter().map(Into::into).collect(); + let item: Vec<#v_ty> = item.into_iter().map(std::convert::TryInto::try_into).collect::, _>>()?; let item: Vec<#term_ty> = item.into_iter().map(Into::into).collect(); self.#fname = Some(item.into()); - self + Ok(self) } }; diff --git a/examples/basic.rs b/examples/basic.rs index 790936a..310fe60 100644 --- a/examples/basic.rs +++ b/examples/basic.rs @@ -1,19 +1,16 @@ -use activitystreams::{ - object::Video, - primitives::{MimeMediaType, XsdAnyUri, XsdDuration}, -}; +use activitystreams::object::Video; fn main() -> Result<(), Box> { let mut v = Video::default(); v.as_mut() - .set_context_xsd_any_uri("https://www.w3.org/ns/activitystreams".parse::()?) - .set_id("https://example.com/@example/lions".parse::()?) - .set_url_xsd_any_uri("https://example.com/@example/lions/video.webm".parse::()?) - .set_name_xsd_string("My Cool Video") - .set_summary_xsd_string("A video about some cool lions") - .set_media_type("video/webm".parse::()?) - .set_duration("PT4M20S".parse::()?); + .set_context_xsd_any_uri("https://www.w3.org/ns/activitystreams")? + .set_id("https://example.com/@example/lions")? + .set_url_xsd_any_uri("https://example.com/@example/lions/video.webm")? + .set_name_xsd_string("My Cool Video")? + .set_summary_xsd_string("A video about some cool lions")? + .set_media_type("video/webm")? + .set_duration("PT4M20S")?; println!("Video, {:#?}", v);