class DBus::Type::Parser
D-Bus type parser class¶ ↑
Helper class to parse a type signature in the protocol. @api private
Public Class Methods
new(signature)
click to toggle source
Create a new parser for the given signature. @param signature [Signature]
# File lib/dbus/type.rb 197 def initialize(signature) 198 @signature = signature 199 if signature.size > 255 200 msg = "Potential signature is longer than 255 characters (#{@signature.size}): #{@signature}" 201 raise SignatureException, msg 202 end 203 204 @idx = 0 205 end
Public Instance Methods
nextchar()
click to toggle source
Returns the next character from the signature.
# File lib/dbus/type.rb 208 def nextchar 209 c = @signature[@idx] 210 @idx += 1 211 c 212 end
parse()
click to toggle source
Parse the entire signature, return a DBus::Type object. @return [Array<Type>]
# File lib/dbus/type.rb 263 def parse 264 @idx = 0 265 ret = [] 266 while (c = nextchar) 267 ret << parse_one(c) 268 end 269 ret.freeze 270 end
parse1()
click to toggle source
Parse one {SingleCompleteType} @return [Type]
# File lib/dbus/type.rb 274 def parse1 275 c = nextchar 276 raise SignatureException, "Empty signature, expecting a Single Complete Type" if c.nil? 277 278 t = parse_one(c) 279 raise SignatureException, "Has more than a Single Complete Type: #{@signature}" unless nextchar.nil? 280 281 t.freeze 282 end
parse_one(char, for_array: false)
click to toggle source
Parse one character char of the signature. @param for_array [Boolean] are we parsing an immediate child of an ARRAY @return [Type]
# File lib/dbus/type.rb 217 def parse_one(char, for_array: false) 218 res = nil 219 case char 220 when "a" 221 res = Type.new(ARRAY) 222 char = nextchar 223 raise SignatureException, "Empty ARRAY in #{@signature}" if char.nil? 224 225 child = parse_one(char, for_array: true) 226 res << child 227 when "(" 228 res = Type.new(STRUCT, abstract: true) 229 while (char = nextchar) && char != ")" 230 res << parse_one(char) 231 end 232 raise SignatureException, "STRUCT not closed in #{@signature}" if char.nil? 233 raise SignatureException, "Empty STRUCT in #{@signature}" if res.members.empty? 234 when "{" 235 raise SignatureException, "DICT_ENTRY not an immediate child of an ARRAY" unless for_array 236 237 res = Type.new(DICT_ENTRY, abstract: true) 238 239 # key type, value type 240 2.times do |i| 241 char = nextchar 242 raise SignatureException, "DICT_ENTRY not closed in #{@signature}" if char.nil? 243 244 raise SignatureException, "DICT_ENTRY must have 2 subtypes, found #{i} in #{@signature}" if char == "}" 245 246 res << parse_one(char) 247 end 248 249 # closing "}" 250 char = nextchar 251 raise SignatureException, "DICT_ENTRY not closed in #{@signature}" if char.nil? 252 253 raise SignatureException, "DICT_ENTRY must have 2 subtypes, found 3 or more in #{@signature}" if char != "}" 254 else 255 res = Type.new(char) 256 end 257 res.members.freeze 258 res 259 end