diff --git a/src/fields_parse.rs b/src/fields_parse.rs
index 7ed83e1e..440b45e5 100644
--- a/src/fields_parse.rs
+++ b/src/fields_parse.rs
@@ -67,15 +67,21 @@ pub fn impl_parse_args_named(
 
 fn create_parser<'a>(
     parser_type: &ParserType,
-    types: impl Iterator<Item = &'a Type>,
+    mut types: impl Iterator<Item = &'a Type>,
     count_args: usize,
 ) -> quote::__private::TokenStream {
     let function_to_parse = match parser_type {
         ParserType::Default => match count_args {
             1 => {
-                quote! { (|s: String| Ok((s,))) }
+                let ty = types.next().expect("count_args != types.len()");
+                quote! { (|s: String| {
+                    let res = <#ty>::from_str(&s)
+                        .map_err(|e|ParseError::IncorrectFormat({ let e: Box<dyn std::error::Error + Send + Sync + 'static> = e.into(); e }))?;
+                    Ok((res, ))
+                 })
+                }
             }
-            _ => quote! { compile_error!("Expected 1 argument") },
+            _ => quote! { compile_error!("Expected exactly 1 argument") },
         },
         ParserType::Split { separator } => parser_with_separator(
             &separator.clone().unwrap_or_else(|| " ".to_owned()),