7824: Merge branch 'master' into 7824-arvls-arvput-collection-api-usage
[arvados.git] / services / api / lib / serializers.rb
1 require 'safe_json'
2
3 class Serializer
4   def self.dump(val)
5     SafeJSON.dump(val)
6   end
7
8   def self.legacy_load(s)
9     val = Psych.safe_load(s)
10     if val.is_a? String
11       # If apiserver was downgraded to a YAML-only version after
12       # storing JSON in the database, the old code would have loaded
13       # the JSON document as a plain string, and then YAML-encoded
14       # it when saving it back to the database. It's too late now to
15       # make the old code behave better, but at least we can
16       # gracefully handle the mess it leaves in the database by
17       # double-decoding on the way out.
18       return SafeJSON.load(val)
19     else
20       return val
21     end
22   end
23
24   def self.load(s)
25     if s.nil?
26       object_class.new()
27     elsif s[0] == first_json_char
28       SafeJSON.load(s)
29     elsif s[0..2] == "---"
30       legacy_load(s)
31     else
32       raise "invalid serialized data #{s[0..5].inspect}"
33     end
34   end
35 end
36
37 class HashSerializer < Serializer
38   def self.first_json_char
39     "{"
40   end
41
42   def self.object_class
43     ::Hash
44   end
45 end
46
47 class ArraySerializer < Serializer
48   def self.first_json_char
49     "["
50   end
51
52   def self.object_class
53     ::Array
54   end
55 end