YAML DSL
========

This artifact provides a YAML based DSL for Apache Camel and Apache Camel K.

[WARNING]
====
experimental
====

=== Defining a route

A route is a sequence of elements, or `steps`, defined as follow:

[source, yaml]
----
from: #<1>
  uri: "direct:start"
  steps: #<2>
    - filter:
        expression:
          simple: "${in.header.continue} == true"
        steps: #<2>
          - to:
              uri: "log:filtered"
    - to:
        uri: "log:original"
----
<1> route entry point, by default `from` and `rest` are supported
<2> processing steps

[NOTE]
====
Each step is represented by YAML map that has a single entry where the field name is the EIP name
====

As general rule each step provide all the parameters the related definition declares but there are some minor differences/enhancements:

- *Output Aware Steps*
+
Some steps such as `filter` and `split` have their own pipeline when an exchange matches the filter expression or for the items generated by the split expression, such pipeline can be defined by the `steps` field:
+
[source, yaml]
----
filter:
  expression:
    simple: "${in.header.continue} == true"
      steps:
        - to:
            uri: "log:filtered"
----
+
[NOTE]
====
if the `steps` field is omitted, then each subsequent step is considered part of the filter pipeline.
====

- *Expression Aware Steps*
+
Some EIP such as `filter` and `split` supports the definition of an expression through the `expression` field:
+
[source, yaml]
.Explicit Expression field
----
filter:
    expression:
      simple: "${in.header.continue} == true"
----
+
To make the DSL less verbose, the `expression` field can be omitted:
+
[source, yaml]
.Implicit Expression field
----
filter:
    simple: "${in.header.continue} == true"
----
+
In general expression can be defined inline like in the examples above but in case you need provide more information, you can 'unroll' the expression definition and configure any single parameter the expression defines.
+
[source, yaml]
.Full Expression definition
----
filter:
    tokenize:
      token: "<"
      end-token: ">"
----

- *Data Format Aware Steps*
+
Some EIP such as `set-body` and `marshal` supports the definition of data formats through the `data-format` field:
+
[source, yaml]
.Explicit Data Format field
----
set-body:
    data-format:
      json:
        library: Gson
----
+
To make the DSL less verbose, the `data-format` field can be omitted:
+
[source, yaml]
.Implicit Data Format field
----
set-body:
    json:
      library: Gson
----
+
[NOTE]
====
In case you want to use the data-format's default settings, you need to place an empty block as data format parameters, like `json: {}`
====


=== Supported EIP

- Choice
- Claim Check
- Convert Body
- Delay
- Filter
- Log
- Marshal
- Pipeline
- Process
- Remove Header
- Remove Headers
- Remove Property
- Remove Properties
- Set Body
- Set Header
- Set Property
- Split
- To
- To Dynamic
- Transform


=== Extending the DSL

The DSL is designed to be easily extended so you can provide your own step handler which is discovered at runtime using Camel's factory finder.

Assuming you want to create a step to simplify the creation of a certain type of endpoints then you need:

- create a service definition entry in `META-INF/services/org/apache/camel/k/yaml` with content like:
+
[source, properties]
----
class=com.acme.converter.MyConverter
----

- create the step handler extending `org.apache.camel.k.loader.yaml.parser.ProcessorStepParser`
+

[source, java]
----
package com.acme.converter.AcmeConverter

import org.apache.camel.k.loader.yaml.parser.ProcessorStepParser;public class AcmeConverter
        implements ProcessorStepParser {
    /**
     * @param context contains a references to the camel context and the current node as raw JsonNode
     */
    @Override
    public ProcessorDefinition<?> toProcessor(Context context) {
        // decode the raw json node
        Definition definition = context.node(Definition.class);

        // create the definition
        ToDefinition to = new ToDefinition()
        to.setUri(String.format("http://%s:%d/fixed/path"), definition.host, definition.port)

        return to;
    }

    /*
     * Define the data
     */
    public static final class Definition {
        public String host;

        @JsonSetter(nulls = Nulls.SKIP)
        public Integer port = 8080;
    }
}
----

Assuming the entry in the `META-INF/services/org/apache/camel/k/yaml` is named `acme` then you can use it from the YAML DSL like:


[source, yaml]
----
from:
  uri: "direct:start"
  steps:
    - acme:
        host: acme.com
        port: 8081
----
<1> Parameters go here
