-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathgo2py_converter_py2.go
61 lines (56 loc) · 1.3 KB
/
go2py_converter_py2.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// +build !py3.4
// +build !py3.5
// +build !py3.6
package py
/*
#include "Python.h"
*/
import "C"
import (
"fmt"
"unsafe"
"gopkg.in/sensorbee/sensorbee.v0/data"
)
func newPyObj(v data.Value) (Object, error) {
var pyobj *C.PyObject
var err error
switch v.Type() {
case data.TypeBool:
b, _ := data.ToInt(v)
pyobj = C.PyBool_FromLong(C.long(b))
case data.TypeInt:
i, _ := data.AsInt(v)
pyobj = C.PyInt_FromLong(C.long(i))
case data.TypeFloat:
f, _ := data.AsFloat(v)
pyobj = C.PyFloat_FromDouble(C.double(f))
case data.TypeString:
s, _ := data.AsString(v)
pyobj = newPyString(s)
case data.TypeBlob:
b, _ := data.AsBlob(v)
if len(b) == 0 {
pyobj = C.PyByteArray_FromStringAndSize(nil, 0)
} else {
cb := (*C.char)(unsafe.Pointer(&b[0]))
pyobj = C.PyByteArray_FromStringAndSize(cb, C.Py_ssize_t(len(b)))
}
case data.TypeTimestamp:
t, _ := data.AsTimestamp(v)
pyobj = getPyDateTime(t)
case data.TypeArray:
innerArray, _ := data.AsArray(v)
pyobj, err = newPyArray(innerArray)
case data.TypeMap:
innerMap, _ := data.AsMap(v)
pyobj, err = newPyMap(innerMap)
case data.TypeNull:
pyobj = getPyNone()
default:
err = fmt.Errorf("unsupported type in sensorbee/py: %s", v.Type())
}
if pyobj == nil && err == nil {
return Object{}, getPyErr()
}
return Object{p: pyobj}, err
}