o
    mi&                     @  s   d Z ddlmZ ddlZddlmZmZmZmZm	Z	m
Z
 ddlmZmZmZmZ ddlmZmZmZmZmZ zddlZdZW n eyK   dZdZY nw G d	d
 d
eZG dd deZG dd deZdddZdddZdS )zA Serializer for SPARQL results in JSON:

http://www.w3.org/TR/rdf-sparql-json-res/

Bits and pieces borrowed from:
http://projects.bigasterisk.com/sparqlhttp/

Authors: Drew Perttula, Gunnar Aastrand Grimnes
    )annotationsN)IOAnyDictMappingMutableSequenceOptional)ResultResultExceptionResultParserResultSerializer)BNode
IdentifierLiteralURIRefVariableTFc                   @  s   e Zd ZdZddd	d
ZdS )JSONResultParserz0Parses SPARQL JSON results into a Result object.Nsourcer   content_typeOptional[str]returnr	   c              
   C  sn   |  }tr$z
t|}W t
|S  ty# } ztd| d }~ww t|tr.|d}t	|}t
|S )NzFailed to parse result: utf-8)read_HAS_ORJSONorjsonloads	Exceptionr
   
isinstancebytesdecodejson
JSONResult)selfr   r   inpZloadede r%   c/home/kim/smarthome/.venv/lib/python3.10/site-packages/rdflib/plugins/sparql/results/jsonresults.pyparse    s   


zJSONResultParser.parseN)r   r   r   r   r   r	   )__name__
__module____qualname____doc__r'   r%   r%   r%   r&   r      s    r   c                   @  s0   e Zd ZdZdddZddddZdddZdS )JSONResultSerializerz)Serializes SPARQL results to JSON format.resultr	   c                 C  s   t | | d S r(   )r   __init__)r"   r.   r%   r%   r&   r/   1   s   zJSONResultSerializer.__init__Nstreamr   encodingstrr   Nonec              
     sZ  i } j jdkri |d<  j j|d< ni |d< i |d<  j j|d d<  fdd j jD |d d< tr}z
tj|tjd	}W n t	yQ } zt
d
| d }~ww |d ursz|| W d S  ttfyr   ||d Y d S w ||d d S tj|ddd}|d urz||| W d S  ttfy   || Y d S w || d S )NASKheadbooleanresultsvarsc                   s   g | ]}  |qS r%   )_bindingToJSON.0xr"   r%   r&   
<listcomp>?   s    
z2JSONResultSerializer.serialize.<locals>.<listcomp>bindings)optionzFailed to serialize result: r   F)	allow_nanensure_ascii)r.   type	askAnswerr8   r?   r   r   dumpsZOPT_NON_STR_KEYSr   r
   write	TypeError
ValueErrorr   r    encode)r"   r0   r1   resZr_bytesr$   Zr_strr%   r=   r&   	serialize5   s@   
zJSONResultSerializer.serializebMapping[Variable, Identifier]Dict[Variable, Any]c                 C  s:   i }|D ]}t | || }|d urt | || ||< q|S r(   )
termToJSON)r"   rL   rJ   varjr%   r%   r&   r9   Z   s   z#JSONResultSerializer._bindingToJSON)r.   r	   r(   )r0   r   r1   r2   r   r3   )rL   rM   r   rN   )r)   r*   r+   r,   r/   rK   r9   r%   r%   r%   r&   r-   .   s
    
%r-   c                   @  s    e Zd Zd
ddZdddZd	S )r!   r    Dict[str, Any]c                 C  sv   || _ d|v r
d}nd|v rd}ntdt| | |dkr(t|d | _d S |  | _dd |d d	 D | _d S )
Nr6   r4   r7   ZSELECTzNo boolean or results in json!c                 S  s   g | ]}t |qS r%   )r   r:   r%   r%   r&   r>   s   s    z'JSONResult.__init__.<locals>.<listcomp>r5   r8   )	r    r
   r	   r/   boolrD   _get_bindingsr?   r8   )r"   r    type_r%   r%   r&   r/   d   s   
zJSONResult.__init__r   .MutableSequence[Mapping[Variable, Identifier]]c                 C  sL   g }| j d d D ]}i }| D ]\}}t||t|< q|| q	|S )Nr7   r?   )r    itemsparseJsonTermr   append)r"   retrowZoutRowkvr%   r%   r&   rT   u   s   zJSONResult._get_bindingsN)r    rR   )r   rV   )r)   r*   r+   r/   rT   r%   r%   r%   r&   r!   c   s    
r!   dDict[str, str]r   r   c                 C  s   | d }|dkrt | d S |dkr!t| d | d| ddS |dkr1t| d t | d d	S |d
kr;t| d S td| )zrdflib object (Literal, URIRef, BNode) for the given json-format dict.

    input is like:

    ```json
    { 'type': 'uri', 'value': 'http://famegame.com/2006/01/username' }
    { 'type': 'literal', 'value': 'drewp' }
    ```
    rC   urivalueliteraldatatypexml:lang)rc   langztyped-literal)rc   bnodezjson term type %r)r   r   getr   NotImplementedError)r^   tr%   r%   r&   rX      s   rX   r"   termOptional[Identifier]Optional[Dict[str, str]]c                 C  s   t |trdt|dS t |tr0dt|d}|jd ur$t|j|d< |jd ur.|j|d< |S t |tr<dt|dS |d u rBd S td|t|f )Nr`   )rC   ra   rb   rc   rd   rf   zUnknown term type: %s (%s))	r   r   r2   r   rc   languager   r
   rC   )r"   rj   rr%   r%   r&   rO      s   





rO   )r^   r_   r   r   )r"   r-   rj   rk   r   rl   )r,   
__future__r   r    typingr   r   r   r   r   r   Zrdflib.queryr	   r
   r   r   Zrdflib.termr   r   r   r   r   r   r   ImportErrorr   r-   r!   rX   rO   r%   r%   r%   r&   <module>   s$    
 5
