1
+ #[ macro_use] extern crate cpython;
2
+ extern crate curl;
3
+ extern crate serde;
4
+ extern crate serde_json;
5
+ pub mod utils;
6
+
7
+ use cpython:: { Python , PyDict , PyList , PyResult , ToPyObject , PyObject } ;
8
+ use curl:: http;
9
+ use std:: collections:: BTreeMap ;
10
+ use serde_json:: Value ;
11
+
12
+ fn retpy ( py : Python ) -> PyResult < String > {
13
+ let locals = PyDict :: new ( py) ;
14
+ locals. set_item ( py, "os" , py. import ( "os" ) ?) ?;
15
+ let user: String = py. eval ( "os.getenv('HOME')" , None , Some ( & locals) ) ?. extract ( py) ?;
16
+ Ok ( user. to_string ( ) )
17
+ }
18
+
19
+ fn returl ( py : Python ) -> PyResult < PyObject > {
20
+ let url = "http://validate.jsontest.com/?json=%7B%22key%22:%22value%22%7D" ;
21
+ let resp = http:: handle ( )
22
+ . get ( url)
23
+ . exec ( )
24
+ . unwrap_or_else ( |e| {
25
+ panic ! ( "Falha ao abrir URL {}; Erro: {}" , url, e) ;
26
+ } ) ;
27
+ let body = std:: str:: from_utf8 ( resp. get_body ( ) ) . unwrap_or_else ( |e| {
28
+ panic ! ( "Falha ao interpretar resultado da URL {}; Erro: {}" , url, e) ;
29
+ } ) ;
30
+
31
+ let test: Value = serde_json:: from_str ( & body) . unwrap ( ) ;
32
+
33
+ let ret = utils:: fromjson ( py, test) ;
34
+
35
+ Ok ( ret)
36
+ }
37
+
38
+ fn retmapa ( py : Python ) -> PyResult < PyDict > {
39
+ let dicionario = PyDict :: new ( py) ;
40
+ dicionario. set_item ( py, "chave1" , "valor1" ) ?;
41
+ dicionario. set_item ( py, "chave2" , 123 ) ?;
42
+ Ok ( dicionario)
43
+ }
44
+
45
+ fn reclista ( py : Python , lista_python : Vec < i32 > ) -> PyResult < PyList > {
46
+ let lista_soma = lista_python. iter ( ) . map ( |& x| x + x) . collect :: < Vec < i32 > > ( ) ;
47
+ let lista_retorno = lista_soma. to_py_object ( py) ;
48
+ Ok ( lista_retorno)
49
+ }
50
+
51
+ fn btree_mapa ( py : Python ) -> PyResult < PyDict > {
52
+ let mut dicionario_btree = BTreeMap :: < String , i32 > :: new ( ) ;
53
+ dicionario_btree. insert ( "key" . to_string ( ) , 1 ) ;
54
+ let py_map = dicionario_btree. to_py_object ( py) ;
55
+ Ok ( py_map)
56
+ }
57
+
58
+ fn rec_btree_mapa ( py : Python , mapa : PyDict ) -> PyResult < PyDict > {
59
+ let mut dicionario_btree = BTreeMap :: < String , i32 > :: new ( ) ;
60
+ let res = mapa. items ( py) ;
61
+ for f in res. iter ( ) {
62
+ dicionario_btree. insert ( f. 0 . to_string ( ) , f. 1 . to_string ( ) . parse :: < i32 > ( ) . unwrap ( ) +10 ) ;
63
+ }
64
+ let ret_map = dicionario_btree. to_py_object ( py) ;
65
+ Ok ( ret_map)
66
+ }
67
+
68
+ py_module_initializer ! ( mvrpl, initmvrpl, PyInit_mvrpl , |py, m| {
69
+ try!( m. add( py, "__doc__" , "Este modulo foi escrito em Rust." ) ) ;
70
+ try!( m. add( py, "retpy" , py_fn!( py, retpy( ) ) ) ) ;
71
+ try!( m. add( py, "retmapa" , py_fn!( py, retmapa( ) ) ) ) ;
72
+ try!( m. add( py, "returl" , py_fn!( py, returl( ) ) ) ) ;
73
+ try!( m. add( py, "reclista" , py_fn!( py, reclista( rand_int: Vec <i32 >) ) ) ) ;
74
+ try!( m. add( py, "mapa" , py_fn!( py, btree_mapa( ) ) ) ) ;
75
+ try!( m. add( py, "recmapa" , py_fn!( py, rec_btree_mapa( rand_int: PyDict ) ) ) ) ;
76
+ Ok ( ( ) )
77
+ } ) ;
0 commit comments