Class: Google::Gax::PathTemplate
- Inherits:
-
Object
- Object
- Google::Gax::PathTemplate
- Defined in:
- lib/google/gax/path_template.rb
Overview
PathTemplate parses and format resource names
Instance Attribute Summary collapse
-
#segments ⇒ Object
readonly
Returns the value of attribute segments.
-
#size ⇒ Object
readonly
Returns the value of attribute size.
Class Method Summary collapse
-
.format_segments(*segments) ⇒ String
Formats segments as a string.
Instance Method Summary collapse
-
#initialize(data) ⇒ PathTemplate
constructor
A new instance of PathTemplate.
-
#match(path) ⇒ Hash
Matches a fully qualified path template string.
-
#render(**bindings) ⇒ String
Renders a path template using the provided bindings.
- #to_s ⇒ Object
Constructor Details
#initialize(data) ⇒ PathTemplate
Returns a new instance of PathTemplate.
133 134 135 136 137 |
# File 'lib/google/gax/path_template.rb', line 133 def initialize(data) parser = PathParse.new(PathLex.new) @segments = parser.parse(data) @size = parser.segment_count end |
Instance Attribute Details
#segments ⇒ Object (readonly)
Returns the value of attribute segments.
131 132 133 |
# File 'lib/google/gax/path_template.rb', line 131 def segments @segments end |
#size ⇒ Object (readonly)
Returns the value of attribute size.
131 132 133 |
# File 'lib/google/gax/path_template.rb', line 131 def size @size end |
Class Method Details
.format_segments(*segments) ⇒ String
Formats segments as a string.
144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 |
# File 'lib/google/gax/path_template.rb', line 144 def self.format_segments(*segments) template = '' slash = true segments.each do |segment| if segment.kind == TERMINAL template += '/' if slash template += segment.literal.to_s next end slash = true if segment.kind == BINDING template += "/{#{segment.literal}=" slash = false else template += "#{segment.literal}}" end end template[1, template.length] # exclude the initial slash end |
Instance Method Details
#match(path) ⇒ Hash
Matches a fully qualified path template string.
197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 |
# File 'lib/google/gax/path_template.rb', line 197 def match(path) that = path.split('/') current_var = nil bindings = {} segment_count = @size i = 0 @segments.each do |segment| break if i >= that.size if segment.kind == TERMINAL if segment.literal == '*' bindings[current_var] = that[i] i += 1 elsif segment.literal == '**' size = that.size - segment_count + 1 segment_count += size - 1 bindings[current_var] = that[i, size].join('/') i += size elsif segment.literal != that[i] throw ArgumentError.new( "mismatched literal: '#{segment.literal}' != '#{that[i]}'" ) else i += 1 end elsif segment.kind == BINDING current_var = segment.literal end end if i != that.size || i != segment_count throw ArgumentError.new( "match error: could not instantiate a path template from #{path}" ) end bindings end |
#render(**bindings) ⇒ String
Renders a path template using the provided bindings.
170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 |
# File 'lib/google/gax/path_template.rb', line 170 def render(**bindings) out = [] binding = false @segments.each do |segment| if segment.kind == BINDING literal_sym = segment.literal.to_sym unless bindings.key?(literal_sym) msg = "Value for key #{segment.literal} is not provided" raise ArgumentError.new(msg) end out << bindings[literal_sym] binding = true elsif segment.kind == END_BINDING binding = false else next if binding out << segment.literal.to_s end end out.join('/') end |
#to_s ⇒ Object
233 234 235 |
# File 'lib/google/gax/path_template.rb', line 233 def to_s self.class.format_segments(*@segments) end |