@@ -24,7 +24,10 @@ pub struct Frontmatter {
2424    pub  tags :  Option < Vec < liquid_core:: model:: KString > > , 
2525    #[ serde( skip_serializing_if = "Option::is_none" ) ]  
2626    pub  excerpt_separator :  Option < liquid_core:: model:: KString > , 
27-     #[ serde( skip_serializing_if = "Option::is_none" ) ]  
27+     #[ serde(  
28+         skip_serializing_if = "Option::is_none" ,  
29+         deserialize_with = "deserialize_date_time"  
30+     ) ]  
2831    pub  published_date :  Option < DateTime > , 
2932    #[ serde( skip_serializing_if = "Option::is_none" ) ]  
3033    pub  format :  Option < SourceFormat > , 
@@ -46,6 +49,32 @@ pub struct Frontmatter {
4649    pub  collection :  Option < liquid_core:: model:: KString > , 
4750} 
4851
52+ fn  deserialize_date_time < ' de ,  D > ( deserializer :  D )  -> Result < Option < DateTime > ,  D :: Error > 
53+ where 
54+     D :  serde:: Deserializer < ' de > , 
55+ { 
56+     let  s:  std:: borrow:: Cow < ' _ ,  str >  = serde:: Deserialize :: deserialize ( deserializer) ?; 
57+     if  s == "now"  || s == "today"  { 
58+         // The date time parsing support now and today not needed in this context 
59+         Err ( serde:: de:: Error :: custom ( format ! ( 
60+             "value '{}' not a valid date time format" , 
61+             s
62+         ) ) ) 
63+     }  else  { 
64+         let  parsed = DateTime :: from_str ( & s) ; 
65+         if  parsed. is_some ( )  { 
66+             Ok ( parsed) 
67+         }  else  if  !s. trim ( ) . is_empty ( )  { 
68+             Err ( serde:: de:: Error :: custom ( format ! ( 
69+                 "value '{}' not a valid date time format" , 
70+                 s
71+             ) ) ) 
72+         }  else  { 
73+             Ok ( None ) 
74+         } 
75+     } 
76+ } 
77+ 
4978impl  Frontmatter  { 
5079    pub  fn  empty ( )  -> Self  { 
5180        Self :: default ( ) 
0 commit comments