o
    `j@                     @   sD   d dl mZ d dlmZ d dlmZ d dlmZ G dd deZdS )   )	BaseField)TaggedFields)UnsignedVarInt32)CodegenContextc                       s   e Zd Zedd Z fddZedd Zdd Zd	d
 Z	dd Z
edd Zdd Zdd Zdd Zdd Zd1ddZ		d2ddZd1ddZd3dd Zd3d!d"Zd1d#d$Zd%d& Zd4d'd(Zd5d)d*Zd+d, Z fd-d.Zd/d0 Z  ZS )6StructFieldc                 C   s.   d|vs|d  drd S d|v r| |S d S )Ntypez[]fields)
startswith)clsjson r   b/home/djax/ivt_ai_plugin/venv/lib/python3.10/site-packages/kafka/protocol/schemas/fields/struct.py
parse_json   s
   zStructField.parse_jsonc                    s:   t  | dd | jD | _d | _i | _i | _i | _d S )Nc                 S   s   i | ]}|j |qS r   )name.0fieldr   r   r   
<dictcomp>   s    z(StructField.__init__.<locals>.<dictcomp>)super__init___fields
_field_map_data_class_untagged_fields_cache_tagged_fields_cache_compiled_encoders)selfr   	__class__r   r   r      s   
zStructField.__init__c                 C      | j S N)r   r   r   r   r   r         zStructField.fieldsc                 C   s   dS )NTr   r!   r   r   r   	is_struct   s   zStructField.is_structc                 C   s
   | j d uS r    r   r!   r   r   r   has_data_class"      
zStructField.has_data_classc                 C   s   | j d u sJ || _ d S r    r$   )r   
data_classr   r   r   set_data_class%   s   
zStructField.set_data_classc                 C   r   r    r$   r!   r   r   r   r'   )   r"   zStructField.data_classc                 O   s   | j |i |S r    )r'   )r   argskwr   r   r   __call__-   s   zStructField.__call__c                 C   s>   |dkrd S | j d urd S |std| j dtd| j )Nnullz0Default value not implemented for struct field ''zDInvalid default for struct field %s. The only valid default is null.)_tagNotImplementedError_name
ValueError)r   defaultr   r   r   _calculate_default0   s   
zStructField._calculate_defaultc                    s2    | j vrt fdd| jD | j  < | j   S )Nc                    s$   g | ]}|  r| r|qS r   for_version_qtagged_field_qr   versionr   r   
<listcomp>=   s
    
z-StructField.tagged_fields.<locals>.<listcomp>)r   r   r   r   r8   r   r7   r   tagged_fields:   s
   


zStructField.tagged_fieldsc                    s.    | j vr fdd| jD | j  < | j   S )Nc                    s$   g | ]}|  r| s|qS r   r4   r   r7   r   r   r9   D   s    z/StructField.untagged_fields.<locals>.<listcomp>)r   r   r:   r   r7   r   untagged_fieldsB   s
   


zStructField.untagged_fieldsNFc           	         s  |  rd u rdS d}nd}| }ttr-dd tt|kr(i nd }n+ttr9dd }nttttfrRt|dksKJ d	d
d i }ndd } fddt	|D }rw|
| j|d nd u r|
t  |d| S )N          c                 S   s   | | S r    r   itemir   r   r   r   <lambda>V   s    z$StructField.encode.<locals>.<lambda>c                 S   s   |  |jS r    )getr   r@   r   r   r   rC   Y       r   zGEncoding single value item (str/int/float) requires single field structc                 S   s   | S r    r   r@   r   r   r   rC   ]   s    c                 S   s   t | |jS r    )getattrr   r@   r   r   r   rC   `   rF   c                    s*   g | ]\}}|j || d qS r8   compacttagged)encode)r   rB   r   rJ   getterrA   rK   r8   r   r   r9   b   s
    
z&StructField.encode.<locals>.<listcomp>r7   )nullable_for_version_qr<   
isinstancetuplelendictstrintfloat	enumerateappendr;   rL   r   encode_emptyjoin)	r   rA   r8   rJ   rK   prefixr   tagsencodedr   rM   r   rL   J   s4   



zStructField.encodec              	   C   sj  |  |o|dko| }|r>||d ||d|  ||d ||d ||d ||d ||d |d }| |}	t|	D ]\}
}|rTd	||
f }nd
||jf }|j||||||d qG|r|d}| ||j	|< ||d ||d|||f  ||d ||d ||d d S |d u r||d ||d ||d d S d S )NrA   r   zif %s is None:z    buf[pos] = 0xff    pos += 1else:z    buf[pos] = 1    z%s[%d]z%s.%srI   tfout.pos = posz#%s.encode_into(%s, out, version=%d)pos = out.posbuf = out.bufz_cap = len(buf)zbuf[pos] = 0zpos += 1)
rO   emit_reserveemitr<   rW   r   emit_encode_intonext_varr;   globs)r   ctx	item_exprindentr8   rJ   rK   tuple_accessinline_nullabler   rB   r   val_exprtf_varr   r   r   rg   l   sF   


zStructField.emit_encode_intoc           	      C   sP  |  |r*|d |d u rd|j|j< | jd7  _d S d|j|j< | jd7  _| |}t|trJt|D ]\}}|j|| ||||d q8nAt|t	rc|D ]}|j|
|j||||d qQn(t|tttfrx|d j|||||d n|D ]}|jt||j||||d qz|r| |j|||d d S |d u rt|d d S d S )Nr      rI       r7   )rO   ensurebufposr<   rP   rQ   rW   encode_intorS   rE   r   rT   rU   rV   rG   r;   r   )	r   rA   outr8   rJ   rK   r   rB   r   r   r   r   rv      s4   




zStructField.encode_intoc                 C   s`   t  }d}|jd ||d ||d ||d | j|d||||d ||d |S )	Nr`   zdef _encode(item, out):rd   rc   z@_cap = len(buf)  # cached len(buf); kept in sync by emit_reserverA   rI   rb   )r   linesrX   rf   rg   )r   r8   rJ   rK   rj   rl   r   r   r   encode_into__optimized_context   s   z*StructField.encode_into__optimized_contextc                 C   s`   |||f}|| j vr+| j|||d}tt| d| j|f d|j |jd | j |< | j | S )zReturn a compiled flat encode function for this struct+version.

        Lazily compiled on first call and cached. The returned function has
        signature: f(item, out) where out is an EncodeBuffer.
        )rJ   rK   z<codegen:%s_v%d>exec_encode)r   ry   rz   compilesourcer   ri   )r   r8   rJ   rK   keyrj   r   r   r   compiled_encode_into   s   

"
z StructField.compiled_encode_intoc                    s  |  |o|dk}|r/ |d  |d  |d|   |d  |d |d }| |}| j}	|	duri d}
|	 j|
<  |d	||
f   |d
||f   |d|   |d|  d}|t|k r<|| }| rg }d}d}|t|k r|| }| r|| ||j	j
7 }||j	j7 }|d7 }nn|t|k st|dkr|d } d}|j |||||d |	durֈ |d||j|f  n_ fdd|D } |dd||f   |d|  |	durt||D ]\}} |d||j|f  qn% d}|j |||||d |	dur2 |d||j|f  |d7 }|t|k sr|r] |d  |d  |d |  ||d | dS |du rj |d dS dS )zEmit decode code that creates a DataContainer via __new__ + direct slot assignment.

        Batches adjacent batchable fields into single unpack_from calls.
        objzif data[pos] == 0xff:r^   z    %s = Noner_   r`   Ndcz%s = object.__new__(%s)z%s._version = %dz%s.tags = Nonez%s.unknown_tags = Nonerr   >r   valrI   z
%s.%s = %sc                    s   g | ]}  d qS )r   )rh   )r   _rj   r   r   r9     s    z0StructField.emit_decode_from.<locals>.<listcomp>z!%s = unpack_from("%s", data, pos)z, z	pos += %dzif data[pos] == 0:zpos += 1  # empty tagged fields)rO   rf   r<   r'   rh   ri   rR   is_batchablerX   _typefmtsizeemit_decode_fromr   rZ   zip_emit_tagged_decode)r   rj   var_namerl   r8   rJ   rK   rn   r   r'   dc_varrB   r   batch_fields	batch_fmt
batch_sizefv	var_namesr   r   r   r      s   












-
zStructField.emit_decode_fromc                 C   s   | d}| ||j|< tdj|jd< | d}||d|  ||d|||f  ||d|  ||d ||d	 ||d
 ||d||f  ||d|  ||d ||d||f  ||d|  ||d|  dS )z>Emit tagged fields decode - falls back to method-based decode.ra   io_BytesIObioz %s = _BytesIO(bytes(data[pos:]))z _tfd = %s.decode(%s, version=%d)zpos += %s.tell()zif _tfd:z!    for _tk, _tv in _tfd.items():z        if _tk.startswith("_"):z<            if %s.unknown_tags is None: %s.unknown_tags = {}z&            %s.unknown_tags[_tk] = _tvz        else:z/            if %s.tags is None: %s.tags = set()z            %s.tags.add(_tk)z!            setattr(%s, _tk, _tv)N)rh   r;   ri   
__import__BytesIOrf   )r   rj   r   rl   r8   rp   bio_varr   r   r   r   "  s    

zStructField._emit_tagged_decodec           
      C   s   d||||f}|| j vrW| j}|dur|| _z<t }d}|jd | j|d||||d ||d | }	tt	|	d| j
|f d	|j |jd
 | j |< W || _n|| _w | j | S )an  Return a compiled flat decode function for this struct+version.

        Lazily compiled on first call and cached. The returned function has
        signature: f(data, pos) -> (obj, pos) where data is a memoryview/bytes.
        data_class overrides self.data_class for the top-level object (needed
        to resolve weakref proxies on ApiMessage classes).
        decodeNr`   zdef _decode(data, pos):r   rI   zreturn obj, posz<codegen_decode:%s_v%d>rz   _decode)r   r   r   rx   rX   r   rf   r}   rz   r|   r   ri   )
r   r8   rJ   rK   r'   r~   savedrj   rl   coder   r   r   compiled_decode_from5  s$   

z StructField.compiled_decode_fromc                    s   |  rddkrd S |d u r| j} fdd| D }r4|| jd n	d u r=t |d urJ|ddi|S |S )Nr   r=   c              	      s"   i | ]}|j |j d qS rH   )r   r   r   rJ   datarK   r8   r   r   r   W  s    z&StructField.decode.<locals>.<dictcomp>r7   r8   r   )	rO   readr'   r<   updater;   r   r   decode_empty)r   r   r8   rJ   rK   r'   decodedr   r   r   r   Q  s   

zStructField.decodec                 C   s
   t | jS r    )rR   r   r!   r   r   r   __len__d  r&   zStructField.__len__c                    s$   t  |sdS | j|jkrdS dS )NFT)r   __eq__r   )r   otherr   r   r   r   g  s
   zStructField.__eq__c                 C   s
   d| j  S )NzStructField(%s))_jsonr!   r   r   r   __repr__n  r&   zStructField.__repr__)NFF)NFFF)FF)FFN)NFFN)__name__
__module____qualname__classmethodr   r   propertyr   r#   r%   r(   r'   r+   r3   r;   r<   rL   rg   rv   ry   r   r   r   r   r   r   r   r   __classcell__r   r   r   r   r      s:    





"

*


W

r   N)	baser   codecs.tagged_fieldsr   codecs.typesr   codegenr   r   r   r   r   r   <module>   s
    