// Package ffi is an optional CGO compatibility wrapper around bat-ffi. // // It is not the primary Go integration path. Product CLI orchestration should // prefer the Rust bat process boundary with --json output, or a future stable // SDK. Keep this package stateless and limited to coarse JSON helper calls. package ffi /* // Links against the release bat-ffi library built by `cargo build --release -p bat-ffi` // (see the `build-ffi` Make target). The rpath lets the resulting binary locate // libbat_ffi.so at runtime without setting LD_LIBRARY_PATH during local development. #cgo LDFLAGS: -L${SRCDIR}/../../target/release -lbat_ffi -Wl,-rpath,${SRCDIR}/../../target/release #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 }