func formatCanonicalResponse(docs model.DocumentSlice, languages acceptlang.AcceptLanguages) ([]byte, error) { var formatFilterPriori []string if languages.Len() > 0 { var langstr []string for _, lang := range languages { langstr = append(langstr, lang.Language) } formatFilterPriori = append(langstr, canonFormatFilterPriority...) } else { formatFilterPriori = canonFormatFilterPriority } // Language Map 型をもつフィールドの言語の種類を一つに絞る docs.Map(func(d model.Document) model.Document { // TODO: 工夫すれば、Mongo の Projection 機能でいけるかもしれない if verb, ok := d.Data["verb"].(map[string]interface{}); ok { if display, ok := verb["display"].(map[string]interface{}); ok { verb["display"] = projectMapSingle(display, formatFilterPriori) } } if object, ok := d.Data["object"].(map[string]interface{}); ok { if objectDefinition, ok := object["definition"].(map[string]interface{}); ok { if name, ok := objectDefinition["name"].(map[string]interface{}); ok { objectDefinition["name"] = projectMapSingle(name, formatFilterPriori) } if description, ok := objectDefinition["description"].(map[string]interface{}); ok { objectDefinition["description"] = projectMapSingle(description, formatFilterPriori) } if choices, ok := objectDefinition["choices"].([]interface{}); ok { objectDefinition["choices"] = projectDescriptionInArray(choices, formatFilterPriori) } if scale, ok := objectDefinition["scale"].([]interface{}); ok { objectDefinition["scale"] = projectDescriptionInArray(scale, formatFilterPriori) } if source, ok := objectDefinition["source"].([]interface{}); ok { objectDefinition["source"] = projectDescriptionInArray(source, formatFilterPriori) } if target, ok := objectDefinition["target"].([]interface{}); ok { objectDefinition["target"] = projectDescriptionInArray(target, formatFilterPriori) } if steps, ok := objectDefinition["steps"].([]interface{}); ok { objectDefinition["steps"] = projectDescriptionInArray(steps, formatFilterPriori) } } } if attachments, ok := d.Data["attachments"].(map[string]interface{}); ok { if display, ok := attachments["display"].(map[string]interface{}); ok { attachments["display"] = projectMapSingle(display, formatFilterPriori) } if display, ok := attachments["description"].(map[string]interface{}); ok { attachments["description"] = projectMapSingle(display, formatFilterPriori) } } return d }) return json.Marshal(map[string]interface{}{ "statements": docs.ToDataArray(), "more": "", }) }