
    i@                        d dl mZ d dlmZmZmZmZmZmZm	Z	m
Z
mZmZ eeeedf   Zede	d   ef   Zeeef   Zeddef   Zeeef   Zee   Z ed      Z ed	      Z G d
 de      Zdede
e   defdZ G d de      Zej8                  Zdedeegef   dedeeef   deeef   f
dZefdededeeef   deeef   fdZefdededeeef   deee f   fdZ!efdededeeef   deeef   fdZ"dededee   dee   fdZ#dededeeee f      deeee f      fdZ$efdededeeef   deeef   fdZ%efdededeegef   deeef   deeef   f
dZ&efdededeeef   deee	e   f   fdZ'efdeded ee   deeef   deeef   f
d!Z(dededeegef   deee	e   f   fd"Z)d#d$d%edefd&Z*d'ed(edefd)Z+d'ed(eddfd*Z,y)+    )Enum)
Callable	ContainerDictListMappingOptionalSequenceTypeTypeVarUnionN
JsonObject	JsonValueJsonDictJsonListDTTc                   4     e Zd ZU eed<   dedef fdZ xZS )	JsonErrorvaluemsgc                 2    t         |   |       || _        y N)super__init__r   )selfr   r   	__class__s      2/usr/lib/python3/dist-packages/cockpit/jsonutil.pyr   zJsonError.__init__   s    
    )__name__
__module____qualname__object__annotations__strr   __classcell__)r   s   @r   r   r      s     Mf 3  r   r   r   expected_typereturnc                 P    t        | |      st        | d|j                         | S )z>Ensure a JSON value has the expected type, returning it if so.zmust have type )
isinstancer   r    )r   r'   s     r   typecheckedr+   !   s,    e]+1G1G0HIJJLr   c                       e Zd ZdZy)_Emptyr   N)r    r!   r"   TOKEN r   r   r-   r-   +   s    Er   r-   objcastkeydefaultc                     	  || |         S # t         $ r |t        ur|cY S t        | d| d      d t        $ r3}d| d|j                  | |   urdndz   }t        | | d|      |d }~ww xY w)Nzattribute 'z
' required'z
 elements:: )KeyError_emptyr   r   )r0   r1   r2   r3   exctargets         r   _getr<   2   s    ;CH~ F& N{3%z:;E ;se1%#c(9RX[\xq01s:;s   
 A.A..A))A.c                      t        | d ||      S )Nc                 "    t        | t              S r   )r+   boolvs    r   <lambda>zget_bool.<locals>.<lambda>?       {1d3 r   r<   r0   r2   r3   s      r   get_boolrF   >       3S'BBr   c                      t        | d ||      S )Nc                 "    t        | t              S r   )r+   intr@   s    r   rB   zget_int.<locals>.<lambda>C       {1c2 r   rD   rE   s      r   get_intrL   B       2CAAr   c                      t        | d ||      S )Nc                 "    t        | t              S r   r+   r%   r@   s    r   rB   zget_str.<locals>.<lambda>G   rK   r   rD   rE   s      r   get_strrQ   F   rM   r   c                      t        | d ||      S )Nc                 *    | d S t        | t              S r   rP   r@   s    r   rB   z!get_str_or_none.<locals>.<lambda>K   s    qyt k!S6I r   rD   rE   s      r   get_str_or_nonerT   J   s    I3PWXXr   c                 X    dt         dt        t        t        f   fd}t	        | |||      S )Nr   r(   c                 J    t        | t        t        f      st        | d      | S )Nzmust be a string or integer)r*   r%   rJ   r   r   s    r   as_str_or_intz%get_str_or_int.<locals>.as_str_or_intO   s#    %#s,E#@AAr   )r   r   r%   rJ   r<   )r0   r2   r3   rX   s       r   get_str_or_intrY   N   s0    Y 5c? 
 ]C11r   c                      t        | d ||      S )Nc                 "    t        | t              S r   r+   dictr@   s    r   rB   zget_dict.<locals>.<lambda>X   rC   r   rD   rE   s      r   get_dictr^   W   rG   r   constructorc                 &    t        | fd||      S )Nc                 0     t        | t                    S r   r\   )rA   r_   s    r   rB   zget_object.<locals>.<lambda>a   s    {;q$+?@ r   rD   )r0   r2   r_   r3   s     ` r   
get_objectrb   [   s     @#wOOr   c                 L    dt         dt        t           fd}t        | |||      S )Nr   r(   c                 B    t        d t        | t              D              S )Nc              3   <   K   | ]  }t        |t                y wr   rP   ).0items     r   	<genexpr>z,get_strv.<locals>.as_strv.<locals>.<genexpr>f   s     Q[s+Qs   tupler+   listrW   s    r   as_strvzget_strv.<locals>.as_strve   s    QE48PQQQr   )r   r
   r%   r<   )r0   r2   r3   rl   s       r   get_strvrm   d   s-    Ry RXc] RWc7++r   choicesc                 D    dt         dt        ffd}t        | |||      S )Nr   r(   c                 T    t        | t              r| v r| S t        | d|  d       )Nzinvalid value "z	" not in )r*   r%   r   )r   rn   s    r   	as_choicezget_enum.<locals>.as_choicem   s5     eS!ew&6Ly	JKKr   )r   r%   r<   )r0   r2   rn   r3   rq   s     `  r   get_enumrr   j   s,    L Ls L YW--r   c                 R    dt         dt        t           ffd}t        | ||d      S )Nr   r(   c                 H    t        fdt        | t              D              S )Nc              3   J   K   | ]  } t        |t                      y wr   r\   )rf   rg   r_   s     r   rh   z,get_objv.<locals>.as_objv.<locals>.<genexpr>x   s     _d[T4!89_s    #ri   )r   r_   s    r   as_objvzget_objv.<locals>.as_objvw   s    _kRWY]F^___r   r/   )r   r
   r   r<   )r0   r2   r_   rv   s     ` r   get_objvrw   v   s.    `y `Xa[ `Wc2&&r   messagezJsonObject | Nonekwargsc                     t        | xs i       }|j                         D ]  \  }}|j                  dd      }|||<    |S )a  Constructs 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.
    _-)r]   itemsreplace)rx   ry   resultr2   r   json_keys         r   create_objectr   |   sL     '-R Flln !
U;;sC( x!
 Mr   currentpatchc                    t        |       }|j                         D ]c  \  }}t        |t              r4| j	                  |d      }t        |t              si }t        ||      ||<   J||||<   R|j                  |d       e |S )u   Perform a JSON merge patch (RFC 7396) using 'current' and 'patch'.
    Neither of the original dictionaries is modified — the result is returned.
    N)r]   r}   r*   r   getjson_merge_patchpop)r   r   r   r2   patch_valuecurrent_values         r   r   r      s    
 ']F!KKM 	"[k7+#KKT2MmW5 "*=+FF3K$%F3KJJsD!	" Mr   c                     t        |j                               D ]r  \  }}| j                  |d      }t        |t              r7t        |t              si x| |<   }t        ||       Lt        ||       |r[||= _||k(  r||= h||| |<   p| |= t y)zPerform a JSON merge patch (RFC 7396) modifying 'current' with 'patch'.
    Also modifies 'patch' to remove redundant operations.
    N)rj   r}   r   r*   r]   json_merge_and_filter_patch)r   r   r2   r   r   s        r   r   r      s     "%++-0 [C.k4(mT2/11}+M;G+M;G"c
k)c
$&GCL!r   )-enumr   typingr   r   r   r   r   r	   r
   r   r   r   r%   floatr?   JsonLiteralr   r   JsonDocumentr   r   r   r   	Exceptionr   r+   r-   r.   r9   r<   rF   rJ   rL   rQ   rT   rY   r^   rb   rm   rr   rw   r   r   r   r/   r   r   <module>r      s    e e eCd*+ , 5{BC	S)^$
 Z[89\!" T]CL	 y a Q T  
	;j 	;)a 8 	;s 	;USUW]S]M^ 	;chijlninco 	; FL C* C3 Cr6z1B CPUVXZ^V^P_ C EK B B# Bb&j0A BuUWY\U\~ B EK B B# Bb&j0A BuUWY\U\~ BY Y# Y Y(SV- Y2
 2 2xc3h7P 2U]^cdgildl^mUn 2 FL C* C3 Cr6z1B CPUVXZdVdPe C "(	P	P	P :,/*P 2v:	P
 2q5\P FL ,* ,3 ,r6z1B ,PUVXZbcfZgVgPh , V\	.		.	.(1#	.AFr6zAR	.
2s7^	.'* '3 'XzlAo5N 'SXY[]efg]hYhSi '. 
 z 2j  
 ( ( t r   