a h@sddlmZddlmZmZmZmZmZmZm Z m Z m Z m Z e e eedfZe de defZee efZe ddefZee efZeeZe dZe d ZGd d d eZee eed d dZGdddeZejZeeegefe e eefe eefdddZefee e eefe eefdddZefee e eefe ee fdddZ!efee e eefe ee fdddZ"ee ee ee dddZ#ee ee e e fee e e fdddZ$efee e eefe eefddd Z%efee eegefe eefe eefd!d"d#Z&efee e eefe ee e fdd$d%Z'efee ee e eefe ee fd&d'd(Z(ee eegefe ee efd)d*d+Z)d,eed-d.d/Z*eeed0d1d2Z+eedd0d3d4Z,dS)5)Enum) Callable ContainerDictListMappingOptionalSequenceTypeTypeVarUnionN JsonObject JsonValueJsonDictJsonListDTTcs.eZdZUeed<eedfdd ZZS) JsonErrorvalue)rmsgcst|||_dSN)super__init__r)selfrr __class__4/usr/lib/python3.9/site-packages/cockpit/jsonutil.pyr(s zJsonError.__init__)__name__ __module__ __qualname__object__annotations__strr __classcell__rrrrr%s r)r expected_typereturncCs t||st|d|j|S)z>Ensure a JSON value has the expected type, returning it if so.zmust have type ) isinstancerr)rr%rrr typechecked-s r(c@seZdZdZdS)_EmptyrN)rrr TOKENrrrrr)7sr))objcastkeydefaultr&c Csz|||WStyD|tur,|YSt|d|ddYn\ty}zDd|d|j||urndnd}t||d||WYd}~n d}~00dS)Nz attribute 'z ' required'z elements:: )KeyError_emptyrr)r+r,r-r.exctargetrrr_get>s "r6)r+r-r.r&cCst|dd||S)NcSs t|tSr)r(boolvrrrKzget_bool..r6r+r-r.rrrget_boolJsr>cCst|dd||S)NcSs t|tSr)r(intr8rrrr:Or;zget_int..r<r=rrrget_intNsr@cCst|dd||S)NcSs t|tSrr(r#r8rrrr:Sr;zget_str..r<r=rrrget_strRsrBcCst|dd||S)NcSs|dur dSt|tSrrAr8rrrr:Wr;z!get_str_or_none..r<r=rrrget_str_or_noneVsrCcCs&ttttfddd}t||||S)Nrr&cSst|ttfst|d|S)Nzmust be a string or integer)r'r#r?rrrrr as_str_or_int[s z%get_str_or_int..as_str_or_int)rr r#r?r6)r+r-r.rFrrrget_str_or_intZsrGcCst|dd||S)NcSs t|tSrr(dictr8rrrr:dr;zget_dict..r<r=rrrget_dictcsrJ)r+r- constructorr.r&cst|fdd||S)Ncst|tSrrHr8rKrrr:mr;zget_object..r<)r+r-rKr.rrLr get_objectgsrMcCs"tttddd}t||||S)NrDcSstddt|tDS)Ncss|]}t|tVqdSrrA.0itemrrr rr;z,get_strv..as_strv..tupler(listrErrras_strvqszget_strv..as_strv)rr r#r6)r+r-r.rUrrrget_strvpsrV)r+r-choicesr.r&cs"ttdfdd }t||||S)NrDcs0t|tr|vr|St|d|ddS)Nzinvalid value "z " not in )r'r#rrErWrr as_choiceyszget_enum..as_choice)rr#r6)r+r-rWr.rYrrXrget_enumvsrZ)r+r-rKr&cs&tttdfdd }t|||dS)NrDcstfddt|tDS)Nc3s|]}t|tVqdSrrHrNrLrrrQr;z,get_objv..as_objv..rRrErLrras_objvszget_objv..as_objvr)rr rr6)r+r-rKr[rrLrget_objvsr\zJsonObject | None)messagekwargsr&cCs6t|pi}|D]\}}|dd}|||<q|S)aConstructs a JSON object based on message and kwargs. If only message is given, it is returned, unmodified. If message is None, it is equivalent to an empty dictionary. A copy is always made. If kwargs are present, then any underscore ('_') present in a key name is rewritten to a dash ('-'). This is intended to bridge between the required Python syntax when providing kwargs and idiomatic JSON (which uses '-' for attributes). These values override values in message. The idea is that `message` should be used for passing data along, and kwargs used for data originating at a given call site, possibly including modifications to an original message. _-)rIitemsreplace)r]r^resultr-rZjson_keyrrr create_objects    rd)currentpatchr&cCspt|}|D]Z\}}t|trL||d}t|tsr?r@rBrCrGrJrMrVrZr\rdrhrlrrrrsL 0   0 (((, (   , *