package ffi /* #cgo CFLAGS: -I${SRCDIR}/../../target/bat-ffi #cgo LDFLAGS: -L${SRCDIR}/../../target/debug -lbat_ffi #include typedef char* ccharp; extern const char* bat_version(); extern void bat_free_string(char* s); extern char* bat_manifest_inspect_json(const char* raw_json); extern char* bat_sync_plan_json(const char* current_json, const char* previous_json); */ import "C" import ( "errors" "unsafe" ) func Version() (string, error) { ptr := C.bat_version() if ptr == nil { return "", errors.New("bat_version returned nil") } defer C.bat_free_string((*C.char)(unsafe.Pointer(ptr))) return C.GoString(ptr), nil } func InspectManifest(rawJSON string) (string, error) { cRaw := C.CString(rawJSON) defer C.free(unsafe.Pointer(cRaw)) ptr := C.bat_manifest_inspect_json(cRaw) if ptr == nil { return "", errors.New("bat_manifest_inspect_json returned nil") } defer C.bat_free_string((*C.char)(unsafe.Pointer(ptr))) return C.GoString(ptr), nil } func BuildSyncPlan(currentJSON, previousJSON string) (string, error) { cCurrent := C.CString(currentJSON) defer C.free(unsafe.Pointer(cCurrent)) var cPrevious *C.char if previousJSON != "" { cPrevious = C.CString(previousJSON) defer C.free(unsafe.Pointer(cPrevious)) } ptr := C.bat_sync_plan_json(cCurrent, cPrevious) if ptr == nil { return "", errors.New("bat_sync_plan_json returned nil") } defer C.bat_free_string((*C.char)(unsafe.Pointer(ptr))) return C.GoString(ptr), nil }