package sushi import ( "strconv" "strings" ) const RouteParamsCtxKey = "route_params" type ParamValue struct { value string exists bool } // RouteParam gets a route parameter by index for chaining func (ctx Ctx) RouteParam(index int) ParamValue { if params, ok := ctx.UserValue(RouteParamsCtxKey).([]string); ok { if index >= 0 && index < len(params) { return ParamValue{value: params[index], exists: true} } } return ParamValue{value: "", exists: false} } // Param gets a route parameter by name for chaining (requires named params) func (ctx Ctx) Param(name string) ParamValue { if paramMap, ok := ctx.UserValue("param_names").(map[string]string); ok { if value, exists := paramMap[name]; exists { return ParamValue{value: value, exists: true} } } return ParamValue{value: "", exists: false} } // String returns the value as string func (p ParamValue) String() string { return p.value } // StringDefault returns string with default value func (p ParamValue) StringDefault(defaultValue string) string { if p.value == "" { return defaultValue } return p.value } // Int returns the value as integer func (p ParamValue) Int() int { if p.value == "" { return 0 } if parsed, err := strconv.Atoi(p.value); err == nil { return parsed } return 0 } // IntDefault returns integer with default value func (p ParamValue) IntDefault(defaultValue int) int { if p.value == "" { return defaultValue } if parsed, err := strconv.Atoi(p.value); err == nil { return parsed } return defaultValue } // Float returns the value as float64 func (p ParamValue) Float() float64 { if p.value == "" { return 0.0 } if parsed, err := strconv.ParseFloat(p.value, 64); err == nil { return parsed } return 0.0 } // FloatDefault returns float64 with default value func (p ParamValue) FloatDefault(defaultValue float64) float64 { if p.value == "" { return defaultValue } if parsed, err := strconv.ParseFloat(p.value, 64); err == nil { return parsed } return defaultValue } // Bool returns the value as boolean func (p ParamValue) Bool() bool { value := strings.ToLower(p.value) return value == "true" || value == "on" || value == "1" || value == "yes" } // BoolDefault returns boolean with default value func (p ParamValue) BoolDefault(defaultValue bool) bool { if p.value == "" { return defaultValue } return p.Bool() } // Exists returns true if the parameter exists func (p ParamValue) Exists() bool { return p.exists } // IsEmpty returns true if the parameter is empty or doesn't exist func (p ParamValue) IsEmpty() bool { return p.value == "" }