@@ -184,6 +184,16 @@ def notifications(self) -> Iterator["PNotif"]:
184
184
for n in ly_list_iter (self .cdata .parsed .notifs ):
185
185
yield PNotif (self .context , n , self )
186
186
187
+ def identities (
188
+ self , parsed : bool = False
189
+ ) -> Union [Iterator ["Identity" ], Iterator ["PIdentity" ]]:
190
+ if parsed :
191
+ for i in ly_array_iter (self .cdata .parsed .identities ):
192
+ yield PIdentity (self .context , i , self )
193
+ else :
194
+ for i in ly_array_iter (self .cdata .identities ):
195
+ yield Identity (self .context , i )
196
+
187
197
def __str__ (self ) -> str :
188
198
return self .name ()
189
199
@@ -423,13 +433,16 @@ def name(self) -> str:
423
433
def module (self ) -> Module :
424
434
return self ._module_from_parsed ()
425
435
426
- def parent_node (self ) -> Optional ["PNode" ]:
427
- if not bool (self .cdata .parent_stmt & lib .LY_STMT_NODE_MASK ):
428
- return None
429
- try :
430
- return PNode .new (self .context , self .cdata .parent , self .module_parent )
431
- except LibyangError :
432
- return None
436
+ def parent_node (self ) -> Optional [Union ["PNode" , "PIdentity" ]]:
437
+ if self .cdata .parent_stmt == lib .LY_STMT_IDENTITY :
438
+ cdata = ffi .cast ("struct lysp_ident *" , self .cdata .parent )
439
+ return PIdentity (self .context , cdata , self .module_parent )
440
+ if bool (self .cdata .parent_stmt & lib .LY_STMT_NODE_MASK ):
441
+ try :
442
+ return PNode .new (self .context , self .cdata .parent , self .module_parent )
443
+ except LibyangError :
444
+ return None
445
+ return None
433
446
434
447
435
448
# -------------------------------------------------------------------------------------
@@ -448,13 +461,16 @@ def module(self) -> Module:
448
461
raise self .context .error ("cannot get module" )
449
462
return Module (self .context , self .cdata_def .module )
450
463
451
- def parent_node (self ) -> Optional ["SNode" ]:
452
- if not bool (self .cdata .parent_stmt & lib .LY_STMT_NODE_MASK ):
453
- return None
454
- try :
455
- return SNode .new (self .context , self .cdata .parent )
456
- except LibyangError :
457
- return None
464
+ def parent_node (self ) -> Optional [Union ["SNode" , "Identity" ]]:
465
+ if self .cdata .parent_stmt == lib .LY_STMT_IDENTITY :
466
+ cdata = ffi .cast ("struct lysc_ident *" , self .cdata .parent )
467
+ return Identity (self .context , cdata )
468
+ if bool (self .cdata .parent_stmt & lib .LY_STMT_NODE_MASK ):
469
+ try :
470
+ return SNode .new (self .context , self .cdata .parent )
471
+ except LibyangError :
472
+ return None
473
+ return None
458
474
459
475
460
476
# -------------------------------------------------------------------------------------
@@ -632,6 +648,13 @@ def leafref_path(self) -> Optional["str"]:
632
648
lr = ffi .cast ("struct lysc_type_leafref *" , self .cdata )
633
649
return c2str (lib .lyxp_get_expr (lr .path ))
634
650
651
+ def identity_bases (self ) -> Iterator ["Identity" ]:
652
+ if self .cdata .basetype != lib .LY_TYPE_IDENT :
653
+ return
654
+ ident = ffi .cast ("struct lysc_type_identityref *" , self .cdata )
655
+ for b in ly_array_iter (ident .bases ):
656
+ yield Identity (self .context , b )
657
+
635
658
def typedef (self ) -> "Typedef" :
636
659
if ":" in self .name ():
637
660
module_prefix , type_name = self .name ().split (":" )
@@ -878,6 +901,68 @@ def __str__(self):
878
901
return self .name ()
879
902
880
903
904
+ # -------------------------------------------------------------------------------------
905
+ class Identity :
906
+ __slots__ = ("context" , "cdata" )
907
+
908
+ def __init__ (self , context : "libyang.Context" , cdata ):
909
+ self .context = context
910
+ self .cdata = cdata # C type: "struct lysc_ident *"
911
+
912
+ def name (self ) -> str :
913
+ return c2str (self .cdata .name )
914
+
915
+ def description (self ) -> Optional [str ]:
916
+ return c2str (self .cdata .dsc )
917
+
918
+ def reference (self ) -> Optional [str ]:
919
+ return c2str (self .cdata .ref )
920
+
921
+ def module (self ) -> Module :
922
+ return Module (self .context , self .cdata .module )
923
+
924
+ def derived (self ) -> Iterator ["Identity" ]:
925
+ for i in ly_array_iter (self .cdata .derived ):
926
+ yield Identity (self .context , i )
927
+
928
+ def extensions (self ) -> Iterator [ExtensionCompiled ]:
929
+ for ext in ly_array_iter (self .cdata .exts ):
930
+ yield ExtensionCompiled (self .context , ext )
931
+
932
+ def get_extension (
933
+ self , name : str , prefix : Optional [str ] = None , arg_value : Optional [str ] = None
934
+ ) -> Optional [ExtensionCompiled ]:
935
+ for ext in self .extensions ():
936
+ if ext .name () != name :
937
+ continue
938
+ if prefix is not None and ext .module ().name () != prefix :
939
+ continue
940
+ if arg_value is not None and ext .argument () != arg_value :
941
+ continue
942
+ return ext
943
+ return None
944
+
945
+ def deprecated (self ) -> bool :
946
+ return bool (self .cdata .flags & lib .LYS_STATUS_DEPRC )
947
+
948
+ def obsolete (self ) -> bool :
949
+ return bool (self .cdata .flags & lib .LYS_STATUS_OBSLT )
950
+
951
+ def status (self ) -> str :
952
+ if self .cdata .flags & lib .LYS_STATUS_OBSLT :
953
+ return "obsolete"
954
+ if self .cdata .flags & lib .LYS_STATUS_DEPRC :
955
+ return "deprecated"
956
+ return "current"
957
+
958
+ def __repr__ (self ):
959
+ cls = self .__class__
960
+ return "<%s.%s: %s>" % (cls .__module__ , cls .__name__ , str (self ))
961
+
962
+ def __str__ (self ):
963
+ return self .name ()
964
+
965
+
881
966
# -------------------------------------------------------------------------------------
882
967
class Feature :
883
968
__slots__ = ("context" , "cdata" , "__dict__" )
@@ -1899,6 +1984,57 @@ def extensions(self) -> Iterator["ExtensionParsed"]:
1899
1984
yield ExtensionParsed (self .context , ext , self .module )
1900
1985
1901
1986
1987
+ # -------------------------------------------------------------------------------------
1988
+ class PIdentity :
1989
+ __slots__ = ("context" , "cdata" , "module" )
1990
+
1991
+ def __init__ (self , context : "libyang.Context" , cdata , module : Module ) -> None :
1992
+ self .context = context
1993
+ self .cdata = cdata # C type: "struct lysp_ident *"
1994
+ self .module = module
1995
+
1996
+ def name (self ) -> str :
1997
+ return c2str (self .cdata .name )
1998
+
1999
+ def if_features (self ) -> Iterator [IfFeatureExpr ]:
2000
+ for f in ly_array_iter (self .cdata .iffeatures ):
2001
+ yield IfFeatureExpr (self .context , f , list (self .module .features ()))
2002
+
2003
+ def bases (self ) -> Iterator [str ]:
2004
+ for b in ly_array_iter (self .cdata .bases ):
2005
+ yield c2str (b )
2006
+
2007
+ def description (self ) -> Optional [str ]:
2008
+ return c2str (self .cdata .dsc )
2009
+
2010
+ def reference (self ) -> Optional [str ]:
2011
+ return c2str (self .cdata .ref )
2012
+
2013
+ def extensions (self ) -> Iterator [ExtensionParsed ]:
2014
+ for ext in ly_array_iter (self .cdata .exts ):
2015
+ yield ExtensionParsed (self .context , ext , self .module )
2016
+
2017
+ def deprecated (self ) -> bool :
2018
+ return bool (self .cdata .flags & lib .LYS_STATUS_DEPRC )
2019
+
2020
+ def obsolete (self ) -> bool :
2021
+ return bool (self .cdata .flags & lib .LYS_STATUS_OBSLT )
2022
+
2023
+ def status (self ) -> str :
2024
+ if self .cdata .flags & lib .LYS_STATUS_OBSLT :
2025
+ return "obsolete"
2026
+ if self .cdata .flags & lib .LYS_STATUS_DEPRC :
2027
+ return "deprecated"
2028
+ return "current"
2029
+
2030
+ def __repr__ (self ):
2031
+ cls = self .__class__
2032
+ return "<%s.%s: %s>" % (cls .__module__ , cls .__name__ , str (self ))
2033
+
2034
+ def __str__ (self ):
2035
+ return self .name ()
2036
+
2037
+
1902
2038
# -------------------------------------------------------------------------------------
1903
2039
class PNode :
1904
2040
CONTAINER = lib .LYS_CONTAINER
0 commit comments