Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Complete example

This example defines condition vocabularies, four entities, one transport mutation, and a delivery task. The DSL parser and resolver test suite checks the same source file. The developer documentation test also runs it through the manifold-dsl check command.

condition readiness [
    not_ready
    ready
]

condition cleanliness [
    clean
    dirty
    contaminated
]

entity "van-110" {
    description {
        name = "White VW van"
        plate = "ABC-123"
    }

    capacities {
        payload_mass = 800 kg
        fuel_volume = 60 l
    }

    properties {
        payload_mass = 0 kg
        curb_mass = 1800 kg
        fuel_volume = 50 l
        fuel_per_distance = 0.08 l/km
        speed = 70 km/h
        located_at = @"hq".properties.located_at
    }

    traits [
        vehicle
        van
        diesel
    ]

    conditions {
        readiness = ready
        cleanliness = clean
    }
}

entity "cargo-42" {
    properties {
        mass = 120 kg
        located_at = @"hq".properties.located_at
    }

    traits [
        cargo
    ]

}

entity "hq" {
    traits [
        location
    ]

    properties {
        located_at = location(59.3293, 18.0686)
    }
}

entity "workshop" {
    traits [
        location
    ]

    properties {
        located_at = location(59.3498, 18.0707)
    }
}

mutation "transport-payload" {
    roles [
        van
        payload
        destination
    ]

    requires {
        @van.traits.vehicle
        @van.conditions.readiness = ready
        @payload.traits.cargo
        @destination.traits.location
        @van.properties.located_at = @payload.properties.located_at
        @destination.properties.located_at
        @van.capacities.payload_mass
        @payload.properties.mass
        @van.properties.fuel_volume
        @van.properties.fuel_per_distance
    }

    uses {
        observe [
            @destination.properties.located_at
        ]

        reserve [
            @van
            @payload
        ]

        occupy {
            @van.capacities.payload_mass += @payload.properties.mass
        }
    }

    transforms {
        @van.properties.fuel_volume -=
            $distance * @van.properties.fuel_per_distance

        @van.properties.located_at -> @destination.properties.located_at
        @payload.properties.located_at -> @destination.properties.located_at
    }
}

task "deliver-cargo-42" {
    desired {
        @"cargo-42".properties.located_at = @"workshop".properties.located_at
    }
}

The example is a language fixture. Checking it proves that the current parser and resolver accept it. It does not run the transport mutation or produce a delivery plan.