summaryrefslogtreecommitdiff
path: root/lib/trunk/yaml_storage.rb
blob: 5c075b4185f329831e120b41574f0dee918f3357 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
module Trunk
  class YAMLStorage
    attr_reader :private_key, :absolute_path

    def initialize(absolute_path, private_key)
      @absolute_path = absolute_path
      @private_key = private_key
    end

    def fetch(*args)
      transaction do |storage|
        storage.fetch(*args)
      end
    end

    def store(*args)
      transaction do |storage|
        storage.store(*args)
      end
    end

    private

    def transaction
      hash = YAML.load(IO.read(absolute_path)) || {}
      storage = Storage.new(hash, serializer)
      yield storage
    ensure
      IO.write(absolute_path, YAML.dump(hash))
    end

    def serializer
      serializer = Trunk::Serializers::Composite.new
      serializer.add(Trunk::Serializers::Crypto.new(private_key))
      serializer.add(Trunk::Serializers::Base64.new)
      serializer
    end
  end
end