// we shouldn't ever get an error from this, but I'd rather not panic func convertCFTypeToInterface(cfType cfTypeRef) (interface{}, error) { typeId := C.CFGetTypeID(C.CFTypeRef(cfType)) switch typeId { case C.CFStringGetTypeID(): return convertCFStringToString(C.CFStringRef(cfType)), nil case C.CFNumberGetTypeID(): return convertCFNumberToInterface(C.CFNumberRef(cfType)), nil case C.CFBooleanGetTypeID(): return convertCFBooleanToBool(C.CFBooleanRef(cfType)), nil case C.CFDataGetTypeID(): return convertCFDataToBytes(C.CFDataRef(cfType)), nil case C.CFDateGetTypeID(): return convertCFDateToTime(C.CFDateRef(cfType)), nil case C.CFArrayGetTypeID(): ary, err := convertCFArrayToSlice(C.CFArrayRef(cfType)) return ary, err case C.CFDictionaryGetTypeID(): dict, err := convertCFDictionaryToMap(C.CFDictionaryRef(cfType)) return dict, err } return nil, &UnknownCFTypeError{typeId} }
state := &unmarshalState{} if err := state.unmarshalValue(cfObj, rv); err != nil { return format, err } return format, state.err } type unmarshalState struct { err error } var ( cfArrayTypeID = C.CFArrayGetTypeID() cfBooleanTypeID = C.CFBooleanGetTypeID() cfDataTypeID = C.CFDataGetTypeID() cfDateTypeID = C.CFDateGetTypeID() cfDictionaryTypeID = C.CFDictionaryGetTypeID() cfNumberTypeID = C.CFNumberGetTypeID() cfStringTypeID = C.CFStringGetTypeID() ) var cfTypeMap = map[C.CFTypeID]reflect.Type{ cfArrayTypeID: reflect.TypeOf([]interface{}(nil)), cfBooleanTypeID: reflect.TypeOf(false), cfDataTypeID: reflect.TypeOf([]byte(nil)), cfDateTypeID: reflect.TypeOf(time.Time{}), cfDictionaryTypeID: reflect.TypeOf(map[string]interface{}(nil)), cfStringTypeID: reflect.TypeOf(""), } var cfTypeNames = map[C.CFTypeID]string{