class Syskit::Models::DynamicDataService::InstantiationContext

Intermediate object used to evaluate the blocks given to Syskit::Models::Component#dynamic_service

Attributes

component_model[R]

The component model in which this service is being instantiated

dynamic_service[R]

The dynamic service description

name[R]

The name of the service that is being instantiated

options[R]

A set of options that are accessible from the instanciation block. This allows to create protocols for dynamic service creation, and is specific to the client component model @return [Hash]

service[R]

The instantiated service

Public Class Methods

new(component_model, name, dynamic_service, **options) click to toggle source
# File lib/syskit/models/dynamic_data_service.rb, line 70
def initialize(component_model, name, dynamic_service, **options)
    @component_model, @name, @dynamic_service, @options =
        component_model, name, dynamic_service, options
end

Public Instance Methods

argument(name, options = Hash.new) click to toggle source

Proxy to declare a new argument on the (specialized) component model

@param (see Roby::Models::Task#argument)

# File lib/syskit/models/dynamic_data_service.rb, line 79
def argument(name, options = Hash.new)
    component_model.argument(name, options)
end
driver_for(device_model, port_mappings = Hash.new, **options) click to toggle source
# File lib/syskit/models/dynamic_data_service.rb, line 83
def driver_for(device_model, port_mappings = Hash.new, **options)
    dserv = provides(device_model, port_mappings, **options)
    component_model.argument "#{dserv.name}_dev"
    dserv
end
provides(service_model, port_mappings = Hash.new, as: nil, **arguments) click to toggle source

Proxy for #component_model#provides which does some sanity checks

# File lib/syskit/models/dynamic_data_service.rb, line 91
def provides(service_model, port_mappings = Hash.new, as: nil, **arguments)
    if service
        raise ArgumentError, "this dynamic service instantiation block already created one new service"
    end

    if !service_model.fullfills?(dynamic_service.service_model)
        raise ArgumentError, "#{service_model.short_name} does not fullfill the model for the dynamic service #{dynamic_service.name}, #{dynamic_service.service_model.short_name}"
    end

    if as && as != name
        raise ArgumentError, "the as: argument was given (with value #{as}) but it is required to be #{name}. Note that it can be omitted in a dynamic service block"
    end
    @service = component_model.provides_dynamic(
        service_model, port_mappings, as: name,
        bound_service_class: BoundDynamicDataService, **arguments)
    service.dynamic_service = dynamic_service
    service.dynamic_service_options = self.options.dup
    service

rescue InvalidPortMapping => e
    raise InvalidProvides.new(component_model, service_model, e), "while instanciating the dynamic service #{dynamic_service}: #{e}", e.backtrace
end