in config/cache.go [102:188]
func (c *Config) UpdateCache(response map[string]interface{}) interface{} {
apiCache = make(map[string]*API)
apiVerbMap = nil
count := response["count"]
apiList := response["api"].([]interface{})
for _, node := range apiList {
api, valid := node.(map[string]interface{})
if !valid {
fmt.Println("Error, moving on...")
continue
}
apiName := api["name"].(string)
isAsync := api["isasync"].(bool)
description := api["description"].(string)
idx := 0
for _, chr := range apiName {
if unicode.IsLower(chr) {
idx++
} else {
break
}
}
verb := apiName[:idx]
noun := strings.ToLower(apiName[idx:])
var apiArgs []*APIArg
for _, argNode := range api["params"].([]interface{}) {
apiArg, _ := argNode.(map[string]interface{})
related := []string{}
if apiArg["related"] != nil {
related = strings.Split(apiArg["related"].(string), ",")
sort.Strings(related)
}
apiArgs = append(apiArgs, &APIArg{
Name: apiArg["name"].(string) + "=",
Type: apiArg["type"].(string),
Required: apiArg["required"].(bool),
Related: related,
Description: apiArg["description"].(string),
})
}
// Add filter arg
apiArgs = append(apiArgs, &APIArg{
Name: "filter=",
Type: FAKE,
Description: "cloudmonkey specific response key filtering",
})
sort.Slice(apiArgs, func(i, j int) bool {
return apiArgs[i].Name < apiArgs[j].Name
})
var responseKeys []string
for _, respNode := range api["response"].([]interface{}) {
if resp, ok := respNode.(map[string]interface{}); ok {
if resp == nil || resp["name"] == nil {
continue
}
responseKeys = append(responseKeys, fmt.Sprintf("%v,", resp["name"]))
}
}
sort.Strings(responseKeys)
var requiredArgs []string
for _, arg := range apiArgs {
if arg.Required {
requiredArgs = append(requiredArgs, arg.Name)
}
}
apiCache[strings.ToLower(apiName)] = &API{
Name: apiName,
Verb: verb,
Noun: noun,
Args: apiArgs,
RequiredArgs: requiredArgs,
Async: isAsync,
Description: description,
ResponseKeys: responseKeys,
}
}
return count
}