Search code examples
yamlraml

Is there a way to mark the end of a method in RAML?


I'm writing some RAML in an API designer and I have the following code:

/users:
  /{id}:
    /tags:
    description: Personal tags of a user
    get:
      description: A list of the user's personal tags
      responses:
        200:
          body:
            application/json:
              example: |
                {
                  tags: [
                    {...},
                    ...
                  ]
                }

      /{slug}:
        description: A personal tag
        put: 

The parser is throwing an error at /{slug} because it thinks that I'm trying to use it as a property of the get: method. However, /{slug} needs to be indented to make it subordinate to /tags.

Is there a way in RAML (or YAML, since RAML is supposed to be an instance of YAML), to mark the end of a map? Or do you have any other suggestions?


Solution

  • RAML doesn't (AFAIK) support explicit termination of maps, but we also don't need that to solve your problem :-).

    Since in YAML the whitespace is semantic, what's happening is that your GET method is currently indented such that it's a method on the /users/{id} level, so even though it looks like /{slug} is subordinate to tags, it thinks it is in the definition of /users/{id} Really, we should probably throw an error here, since the method definition comes after you've defined a sub-resource (thanks for finding this case).

    To solve, all you need to do is indent your description and get definition for /users/{id}/tags one additional level, and it should all parse fine. Updated RAML is below.

    /users:
      /{id}:
        /tags:
          description: Personal tags of a user
          get:
            description: A list of the user's personal tags
            responses:
              200:
                body:
                  application/json:
                    example: |
                      {
                        tags: [
                          {...},
                          ...
                        ]
                      }
          /{slug}:
            description: A personal tag
            put: