Class: Fusuma::Plugin::Remap::LayerManager

Inherits:
Object
  • Object
show all
Includes:
Singleton
Defined in:
lib/fusuma/plugin/remap/layer_manager.rb

Overview

Set layer sent from pipe

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeLayerManager

Returns a new instance of LayerManager.



13
14
15
16
17
# File 'lib/fusuma/plugin/remap/layer_manager.rb', line 13

def initialize
  @layers = {}
  @reader, @writer = IO.pipe
  @current_layer = {} # preserve order
end

Instance Attribute Details

#current_layerObject (readonly)

Returns the value of attribute current_layer.



11
12
13
# File 'lib/fusuma/plugin/remap/layer_manager.rb', line 11

def current_layer
  @current_layer
end

#readerObject (readonly)

Returns the value of attribute reader.



11
12
13
# File 'lib/fusuma/plugin/remap/layer_manager.rb', line 11

def reader
  @reader
end

#writerObject (readonly)

Returns the value of attribute writer.



11
12
13
# File 'lib/fusuma/plugin/remap/layer_manager.rb', line 11

def writer
  @writer
end

Instance Method Details

#find_mapping(layer = @current_layer) ⇒ Hash

Find remap layer from config

Parameters:

  • layer (Hash) (defaults to: @current_layer)

Returns:

  • (Hash)


55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/fusuma/plugin/remap/layer_manager.rb', line 55

def find_mapping(layer = @current_layer)
  @layers[layer] ||= begin
    result = nil
    _ = Fusuma::Config::Searcher.find_context(layer) {
      result = Fusuma::Config.search(Fusuma::Config::Index.new(:remap))
      next unless result

      result = result.deep_transform_keys do |key|
        key.upcase.to_sym
      end
    }

    result || {}
  end
end

#receive_layerHash

Read layer from pipe and return remap layer

Returns:

  • (Hash)


33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/fusuma/plugin/remap/layer_manager.rb', line 33

def receive_layer
  @layer_unpacker ||= MessagePack::Unpacker.new(@reader)

  data = @layer_unpacker.unpack

  return unless data.is_a? Hash

  data = data.deep_symbolize_keys
  layer = data[:layer] # e.g { thumbsense: true }
  remove = data[:remove] # e.g true

  if remove
    @current_layer.delete_if { |k, _v| layer.key?(k) }
  else
    # If duplicate keys exist, order of keys is preserved
    @current_layer.merge!(layer)
  end
end

#send_layer(layer:, remove: false) ⇒ Object

Parameters:

  • layer (Hash)
  • remove (Boolean) (defaults to: false)


21
22
23
24
25
26
27
28
# File 'lib/fusuma/plugin/remap/layer_manager.rb', line 21

def send_layer(layer:, remove: false)
  # puts "send_layer: #{layer} remove: #{remove}"
  return if @last_layer == layer && @last_remove == remove

  @last_layer = layer
  @last_remove = remove
  @writer.puts({layer: layer, remove: remove}.to_msgpack)
end