include "waypoint.fbs";
namespace osrm.engine.api.fbresult;

table Metadata {
    datasource_names: [string];
}

table Annotation {
    distance: [uint];
    duration: [uint];
    datasources: [uint];
    nodes: [uint];
    weight: [uint];
    speed: [float];
    metadata: Metadata;
}

enum ManeuverType: byte {
    Turn,
    NewName,
    Depart,
    Arrive,
    Merge,
    OnRamp,
    OffRamp,
    Fork,
    EndOfRoad,
    Continue,
    Roundabout,
    Rotary,
    RoundaboutTurn,
    Notification,
    ExitRoundabout,
    ExitRotary
}

enum Turn: byte {
    None,
    UTurn,
    SharpRight,
    Right,
    SlightRight,
    Straight,
    SlightLeft,
    Left,
    SharpLeft
}

table StepManeuver {
    location: Position;
    bearing_before: ushort;
    bearing_after: ushort;
    type: ManeuverType;
    modifier: Turn;
    exit: ubyte;
}

table Lane {
    indications: [Turn];
    valid: bool;
}

table Intersection {
    location: Position;
    bearings: [short];
    classes: [string];
    entry: [bool];
    in_bearing: uint;
    out_bearing: uint;
    lanes: [Lane];
}

table Step {
    distance: float;
    duration: float;
    polyline: string;
    coordinates: [Position];
    weight: float;
    name: string;
    ref: string;
    pronunciation: string;
    destinations: string;
    exits: string;
    mode: string;
    maneuver: StepManeuver;
    intersections: [Intersection];
    rotary_name: string;
    rotary_pronunciation: string;
    driving_side: bool; //Where true stands for the left side.
}

table Leg {
    distance: double;
    duration: double;
    weight: double;
    summary: string;
    annotations: Annotation;
    steps: [Step];
}

table RouteObject {
    distance: float;
    duration: float;
    weight: float;
    weight_name: string;
    confidence: float; //Used only by 'Match' service
    polyline: string;
    coordinates: [Position];
    legs: [Leg];
}