// make is needed to create types for use by test func makevalue(v interface{}) (UnionSassValue, error) { f := reflect.ValueOf(v) err := error(nil) switch f.Kind() { default: return C.sass_make_null(), err case reflect.Bool: return C.sass_make_boolean(C.bool(v.(bool))), err case reflect.String: return C.sass_make_string(C.CString(v.(string))), err case reflect.Struct: //only SassNumber and color.RGBA are supported if reflect.TypeOf(v).String() == "context.SassNumber" { var sn = v.(SassNumber) return C.sass_make_number(C.double(sn.Value), C.CString(sn.Unit)), err } else if reflect.TypeOf(v).String() == "color.RGBA" { var sc = v.(color.RGBA) return C.sass_make_color(C.double(sc.R), C.double(sc.G), C.double(sc.B), C.double(sc.A)), err } else { err = errors.New(fmt.Sprintf("The struct type %s is unsupported for marshalling", reflect.TypeOf(v).String())) return C.sass_make_null(), err } case reflect.Slice: // Initialize the list l := C.sass_make_list(C.size_t(f.Len()), C.SASS_COMMA) for i := 0; i < f.Len(); i++ { t, er := makevalue(f.Index(i).Interface()) if err == nil && er != nil { err = er } C.sass_list_set_value(l, C.size_t(i), t) } return l, err } }
// TODO: validate unit func MakeNumber(f float64, unit string) UnionSassValue { cunit := C.CString(unit) cf := C.double(f) defer C.free(unsafe.Pointer(cunit)) return C.sass_make_number(cf, cunit) }