self.require_field("url", "{}.url".format(location), data, str)
            self.require_field("verb", "{}.verb".format(location), data, set(("get", "post", "delete", "put")))
            self.recommend_field("format", "{}.format".format(location), data, set(("json", "xml", "html", "csv", "text")), not_found="Assuming json.")
            self.require_field("output", "{}.output".format(location), data, str)
            self.recommend_field(
                            "description", 
                            "{}.description".format(name),
                            data, str, not_found="There will be no documentation for {}!".format(name))
            self.typecheck_field("comment", "{}.comment".format(location), data, str)
            if "inputs" in data:
                self.walk_list("{}.inputs".format(location), "inputs", data, self.walk_input)
                # Ensure that every url has the requsite paths!
                if "url" in data:
                    url_input_names = set(map(str, re.findall("<(.*?)>", data["url"])))
                    given_input_names = set([input['path'] for input in data["inputs"].values() if 'path' in input])
                    if not url_input_names.issubset(given_input_names):
                        self.error("Expected full list of url parameters {} for {}, given only {}.".format(list(url_input_names), location, list(given_input_names)))
                    
        else:
            self.type_error(location, dict, type(data))
        return interface

def walk_interface(self, name, data, in_location):
        interface = Interface()
        location = "{}.{}".format(in_location, name)
        if isinstance(data, dict):
            interface.name = de_identifier(self.require_field(location, "name", data, "", str))
            location = "{}.{}".format(in_location, clean_identifier(interface.name))
            interface.returns = de_identifier(self.require_field(location, "returns", data, "", str))
            interface.description = self.recommend_field(location, "description", data, "", str)
            # Implementations
            if "production" in data:
                interface.production = self.walk_implementation("production", data["production"], location)
            else:
                self.not_found_error("{}.{}".format(location, "production"))
            if "test" in data:
                interface.test = self.walk_implementation("test", data["test"], location)
            else:
                interface.test = None
            # Arguments
            interface.args = list(self.walk_list("{}.args".format(location), "args", data, self.walk_interface_arg))
            interface.cache = self.typecheck_field(location, "cache", data, [], list)
        else:
            self.type_error(location, dict, type(data))
        return interface
        '''
            self.require_field("url", "{}.url".format(location), data, str)
            self.require_field("verb", "{}.verb".format(location), data, set(("get", "post", "delete", "put")))
            self.recommend_field("format", "{}.format".format(location), data, set(("json", "xml", "html", "csv", "text")), not_found="Assuming json.")
            self.require_field("output", "{}.output".format(location), data, str)
            self.recommend_field(
                            "description", 
                            "{}.description".format(name),
                            data, str, not_found="There will be no documentation for {}!".format(name))
            self.typecheck_field("comment", "{}.comment".format(location), data, str)
            if "inputs" in data:
                self.walk_list("{}.inputs".format(location), "inputs", data, self.walk_input)
                # Ensure that every url has the requsite paths!
                if "url" in data:
                    url_input_names = set(map(str, re.findall("<(.*?)>", data["url"])))
                    given_input_names = set([input['path'] for input in data["inputs"].values() if 'path' in input])
                    if not url_input_names.issubset(given_input_names):
                        self.error("Expected full list of url parameters {} for {}, given only {}.".format(list(url_input_names), location, list(given_input_names)))
                    
        else:
            self.type_error(location, dict, type(data))
        return interface'''