@@ -263,6 +263,7 @@ private static void WriteStruct(clusterCommand command, bool toServer, TextWrite
263263 to = toVal ;
264264 break ;
265265 case "between" :
266+ case "countBetween" :
266267 case "lengthBetween" :
267268 if ( long . TryParse ( field . constraint . to , out long parsedTo ) )
268269 to = parsedTo ;
@@ -285,6 +286,7 @@ private static void WriteStruct(clusterCommand command, bool toServer, TextWrite
285286
286287 private static void WriteStructType ( bool optional , bool nullable , string type , string ? entryType , int id , long ? from , long ? to , string name , Cluster cluster , TextWriter writer )
287288 {
289+ bool unsigned = false ;
288290 string totalIndent = " " ;
289291 if ( optional )
290292 {
@@ -378,11 +380,8 @@ private static void WriteStructType(bool optional, bool nullable, string type, s
378380 writer . Write ( $ ", { to . Value } ") ;
379381 else if ( from != null && from != 0 )
380382 writer . Write ( ", byte.MaxValue" ) ;
381- if ( from != null && from != 0 )
382- writer . WriteLine ( $ ", { from . Value } );") ;
383- else
384- writer . WriteLine ( ");" ) ;
385- return ;
383+ unsigned = true ;
384+ break ;
386385 case "uint16" :
387386 case "map16" :
388387 case "enum16" :
@@ -396,15 +395,11 @@ private static void WriteStructType(bool optional, bool nullable, string type, s
396395 writer . Write ( $ ", { to . Value } ") ;
397396 else if ( from != null && from != 0 )
398397 writer . Write ( ", ushort.MaxValue" ) ;
399- if ( from != null && from != 0 )
400- writer . WriteLine ( $ ", { from . Value } );") ;
401- else
402- writer . WriteLine ( ");" ) ;
403- return ;
398+ unsigned = true ;
399+ break ;
404400 case "uint24" :
405401 case "uint32" :
406402 case "map32" :
407- case "epoch-s" :
408403 case "cluster-id" :
409404 case "attrib-id" :
410405 case "field-id" :
@@ -417,36 +412,77 @@ private static void WriteStructType(bool optional, bool nullable, string type, s
417412 writer . Write ( $ ", { to . Value } ") ;
418413 else if ( from != null && from != 0 )
419414 writer . Write ( ", uint.MaxValue" ) ;
420- if ( from != null && from != 0 )
421- writer . WriteLine ( $ ", { from . Value } );") ;
415+ unsigned = true ;
416+ break ;
417+ case "epoch-s" :
418+ includes . Add ( "MatterDotNet.Util" ) ;
419+ if ( nullable && ! optional )
420+ writer . Write ( $ "{ totalIndent } if (!{ name } .HasValue)\n { totalIndent } writer.WriteNull({ id } );\n { totalIndent } else\n ") ;
421+ writer . Write ( $ "{ totalIndent } writer.WriteUInt({ id } , TimeUtil.ToEpochSeconds({ name } ") ;
422+ if ( nullable && ! optional )
423+ writer . Write ( "!.Value)" ) ;
422424 else
423- writer . WriteLine ( ");" ) ;
424- return ;
425+ writer . Write ( ")" ) ;
426+ if ( to != null )
427+ writer . Write ( $ ", { to . Value } ") ;
428+ else if ( from != null && from != 0 )
429+ writer . Write ( ", uint.MaxValue" ) ;
430+ unsigned = true ;
431+ break ;
425432 case "elapsed-s" :
426- writer . Write ( $ "{ totalIndent } writer.WriteUInt({ id } , { name } .TotalSeconds") ;
433+ if ( nullable && ! optional )
434+ writer . Write ( $ "{ totalIndent } if (!{ name } .HasValue)\n { totalIndent } writer.WriteNull({ id } );\n { totalIndent } else\n ") ;
435+ writer . Write ( $ "{ totalIndent } writer.WriteUInt({ id } , { name } ") ;
436+ if ( nullable && ! optional )
437+ writer . Write ( "!.Value.TotalSeconds" ) ;
438+ else
439+ writer . Write ( ".TotalSeconds" ) ;
427440 if ( to != null )
428441 writer . Write ( $ ", { to . Value } ") ;
429442 else if ( from != null && from != 0 )
430443 writer . Write ( ", uint.MaxValue" ) ;
431- if ( from != null && from != 0 )
432- writer . WriteLine ( $ ", { from . Value } );") ;
444+ unsigned = true ;
445+ break ;
446+ case "epoch-us" :
447+ includes . Add ( "MatterDotNet.Util" ) ;
448+ if ( nullable && ! optional )
449+ writer . Write ( $ "{ totalIndent } if (!{ name } .HasValue)\n { totalIndent } writer.WriteNull({ id } );\n { totalIndent } else\n ") ;
450+ writer . Write ( $ "{ totalIndent } writer.WriteULong({ id } , TimeUtil.ToEpochUS({ name } ") ;
451+ if ( nullable && ! optional )
452+ writer . Write ( "!.Value)" ) ;
433453 else
434- writer . WriteLine ( ");" ) ;
435- return ;
454+ writer . Write ( ")" ) ;
455+ if ( to != null )
456+ writer . Write ( $ ", { to . Value } ") ;
457+ else if ( from != null && from != 0 )
458+ writer . Write ( ", ulong.MaxValue" ) ;
459+ unsigned = true ;
460+ break ;
436461 case "ref_DataTypeSystemTimeUs" :
437462 case "ref_DataTypeSystemTimeMs" :
438- writer . Write ( $ "{ totalIndent } writer.WriteULong({ id } , { name } { ( type == "ref_DataTypeSystemTimeMs" ? ".TotalMilliseconds" : ".TotalMicroseconds" ) } ") ;
463+ if ( nullable && ! optional )
464+ writer . Write ( $ "{ totalIndent } if (!{ name } .HasValue)\n { totalIndent } writer.WriteNull({ id } );\n { totalIndent } else\n ") ;
465+ writer . Write ( $ "{ totalIndent } writer.WriteULong({ id } , { name } ") ;
466+ if ( nullable && ! optional )
467+ writer . Write ( "!.Value" ) ;
468+ if ( type == "ref_DataTypeSystemTimeMs" )
469+ writer . Write ( ".TotalMilliseconds" ) ;
470+ else
471+ writer . Write ( ".TotalMicroseconds" ) ;
439472 if ( to != null )
440473 writer . Write ( $ ", { to . Value } ") ;
441474 else if ( from != null && from != 0 )
442475 writer . Write ( ", ulong.MaxValue" ) ;
443- if ( from != null && from != 0 )
444- writer . WriteLine ( $ ", { from . Value } );") ;
445- else
446- writer . WriteLine ( ");" ) ;
447- return ;
476+ unsigned = true ;
477+ break ;
448478 case "ref_DataTypePosixMs" :
449- writer . Write ( $ "{ totalIndent } writer.WriteULong({ id } , { name } .ToUnixTimeMilliseconds()") ;
479+ if ( nullable && ! optional )
480+ writer . Write ( $ "{ totalIndent } if (!{ name } .HasValue)\n { totalIndent } writer.WriteNull({ id } );\n { totalIndent } else\n ") ;
481+ writer . Write ( $ "{ totalIndent } writer.WriteULong({ id } , { name } ") ;
482+ if ( nullable && ! optional )
483+ writer . Write ( "!.Value.ToUnixTimeMilliseconds()" ) ;
484+ else
485+ writer . Write ( ".ToUnixTimeMilliseconds()" ) ;
450486 if ( to != null )
451487 writer . Write ( $ ", { to . Value } ") ;
452488 else if ( from != null && from != 0 )
@@ -457,7 +493,6 @@ private static void WriteStructType(bool optional, bool nullable, string type, s
457493 case "uint56" :
458494 case "uint64" :
459495 case "map64" :
460- case "epoch-us" :
461496 case "fabric-id" :
462497 case "node-id" :
463498 case "EUI64" :
@@ -486,9 +521,13 @@ private static void WriteStructType(bool optional, bool nullable, string type, s
486521 case "ref_IpAdr" :
487522 case "ref_Ipv4Adr" :
488523 case "ref_Ipv6Adr" :
524+ if ( nullable && ! optional )
525+ writer . Write ( $ "{ totalIndent } if ({ name } == null)\n { totalIndent } writer.WriteNull({ id } );\n { totalIndent } else\n ") ;
489526 writer . WriteLine ( $ "{ totalIndent } writer.WriteBytes({ id } , { name } .GetAddressBytes());") ;
490527 return ;
491528 case "Hardware Address" :
529+ if ( nullable && ! optional )
530+ writer . Write ( $ "{ totalIndent } if ({ name } == null)\n { totalIndent } writer.WriteNull({ id } );\n { totalIndent } else\n ") ;
492531 writer . WriteLine ( $ "{ totalIndent } writer.WriteBytes({ id } , { name } .GetAddressBytes());") ;
493532 return ;
494533 case "devtype-id" :
@@ -513,10 +552,14 @@ private static void WriteStructType(bool optional, bool nullable, string type, s
513552 if ( HasEnum ( cluster , type ) || HasBitmap ( cluster , type ) )
514553 writer . WriteLine ( $ "{ totalIndent } writer.WriteUShort({ id } , { ( optional || nullable ? "(ushort?)" : "(ushort)" ) } { name } );") ;
515554 else
555+ {
556+ if ( nullable && ! optional )
557+ writer . Write ( $ "{ totalIndent } if ({ name } == null)\n { totalIndent } writer.WriteNull({ id } );\n { totalIndent } else\n ") ;
516558 writer . WriteLine ( $ "{ totalIndent } { name } .Serialize(writer, { id } );") ;
559+ }
517560 return ;
518561 }
519- if ( from != null )
562+ if ( from != null && ( ! unsigned || from != 0 ) )
520563 writer . WriteLine ( $ ", { from . Value } );") ;
521564 else
522565 writer . WriteLine ( ");" ) ;
@@ -532,7 +575,8 @@ private static void WriteFieldReader(bool optional, bool nullable, string type,
532575 else
533576 writer . Write ( $ "{ totalIndent } { name } = ") ;
534577 }
535- bool extraClose = ( id == "-1" || id == "i" ) ;
578+ bool extraOutsideClose = ( id == "-1" || id == "i" ) ;
579+ bool extraInsideClose = false ;
536580 switch ( type )
537581 {
538582 case "array" :
@@ -594,7 +638,6 @@ private static void WriteFieldReader(bool optional, bool nullable, string type,
594638 case "uint24" :
595639 case "uint32" :
596640 case "map32" :
597- case "epoch-s" :
598641 case "cluster-id" :
599642 case "attrib-id" :
600643 case "field-id" :
@@ -609,7 +652,6 @@ private static void WriteFieldReader(bool optional, bool nullable, string type,
609652 case "uint56" :
610653 case "uint64" :
611654 case "map64" :
612- case "epoch-us" :
613655 case "fabric-id" :
614656 case "node-id" :
615657 case "EUI64" :
@@ -635,21 +677,31 @@ private static void WriteFieldReader(bool optional, bool nullable, string type,
635677 case "Hardware Address" :
636678 writer . WriteLine ( $ "new PhysicalAddress(reader.GetBytes({ id } , { ( optional ? "true" : "false" ) } , 8, 6{ ( id == "-1" || id == "i" ? ")!))" : ")!)" ) } ;") ;
637679 return ;
680+ case "epoch-s" :
681+ includes . Add ( "MatterDotNet.Util" ) ;
682+ writer . Write ( $ "TimeUtil.FromEpochSeconds(reader.GetUInt({ id } ") ;
683+ extraInsideClose = true ;
684+ break ;
638685 case "elapsed-s" :
639- writer . WriteLine ( $ "TimeSpan.FromSeconds(reader.GetUInt({ id } ") ;
640- extraClose = true ;
686+ writer . Write ( $ "TimeSpan.FromSeconds(reader.GetUInt({ id } ") ;
687+ extraInsideClose = true ;
688+ break ;
689+ case "epoch-us" :
690+ includes . Add ( "MatterDotNet.Util" ) ;
691+ writer . Write ( $ "TimeUtil.FromEpochUS(reader.GetULong({ id } ") ;
692+ extraInsideClose = true ;
641693 break ;
642694 case "ref_DataTypeSystemTimeUs" :
643- writer . WriteLine ( $ "TimeSpan.FromMicroseconds(reader.GetULong({ id } ") ;
644- extraClose = true ;
695+ writer . Write ( $ "TimeSpan.FromMicroseconds(reader.GetULong({ id } ") ;
696+ extraInsideClose = true ;
645697 break ;
646698 case "ref_DataTypeSystemTimeMs" :
647- writer . WriteLine ( $ "TimeSpan.FromMilliseconds(reader.GetULong({ id } ") ;
648- extraClose = true ;
699+ writer . Write ( $ "TimeSpan.FromMilliseconds(reader.GetULong({ id } ") ;
700+ extraInsideClose = true ;
649701 break ;
650702 case "ref_DataTypePosixMs" :
651- writer . WriteLine ( $ "DateTimeOffset.FromUnixTimeMilliseconds(reader.GetULong({ id } ") ;
652- extraClose = true ;
703+ writer . Write ( $ "DateTimeOffset.FromUnixTimeMilliseconds(reader.GetULong({ id } ") ;
704+ extraInsideClose = true ;
653705 break ;
654706 case "devtype-id" :
655707 writer . Write ( $ "(DeviceTypeEnum)reader.GetUInt({ id } ") ;
@@ -716,14 +768,20 @@ private static void WriteFieldReader(bool optional, bool nullable, string type,
716768 }
717769 return ;
718770 }
719- if ( optional )
771+ if ( extraInsideClose && ( optional || nullable ) )
772+ {
773+ extraOutsideClose = true ;
774+ extraInsideClose = false ;
775+ }
776+ if ( extraInsideClose )
777+ writer . Write ( ")" ) ;
778+ if ( optional || nullable )
720779 writer . Write ( ", true)" ) ;
721780 else
722781 writer . Write ( ")!.Value" ) ;
723- if ( extraClose )
724- writer . WriteLine ( ");" ) ;
725- else
726- writer . WriteLine ( ';' ) ;
782+ if ( extraOutsideClose )
783+ writer . Write ( ")" ) ;
784+ writer . WriteLine ( ';' ) ;
727785 }
728786
729787 private static bool HasEnum ( Cluster cluster , string name )
@@ -1192,7 +1250,6 @@ private static void WriteType(string type, string? entryType, TextWriter writer)
11921250 case "uint24" :
11931251 case "uint32" :
11941252 case "map32" :
1195- case "epoch-s" :
11961253 case "cluster-id" :
11971254 case "attrib-id" :
11981255 case "field-id" :
@@ -1210,12 +1267,16 @@ private static void WriteType(string type, string? entryType, TextWriter writer)
12101267 case "ref_DataTypePosixMs" :
12111268 writer . Write ( "DateTimeOffset" ) ;
12121269 break ;
1270+ case "epoch-s" :
1271+ case "epoch-us" :
1272+ includes . Add ( "MatterDotNet.Util" ) ;
1273+ writer . Write ( "DateTime" ) ;
1274+ break ;
12131275 case "uint40" :
12141276 case "uint48" :
12151277 case "uint56" :
12161278 case "uint64" :
12171279 case "map64" :
1218- case "epoch-us" :
12191280 case "fabric-id" :
12201281 case "node-id" :
12211282 case "EUI64" :
@@ -1310,8 +1371,9 @@ private static string SanitizeDefault(string value, string? type = null, string?
13101371 return value . Split ( ' ' ) [ 0 ] ;
13111372 if ( value . StartsWith ( '"' ) )
13121373 return value ;
1313- else
1314- return value . ToLowerInvariant ( ) ;
1374+ if ( value == "0" && ( type == "epoch-s" || type == "epoch-us" ) )
1375+ return "TimeUtil.EPOCH" ;
1376+ return value . ToLowerInvariant ( ) ;
13151377 }
13161378
13171379 private static bool DefaultValid ( string value )
0 commit comments