Skip to content

soveran/seg

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Seg

Segment matcher for paths.

CI

Description

Seg provides two methods for consuming and capturing path segments. A path is a string that starts with a slash and contains segments separated by slashes, for example /foo/bar/baz or /users/42.

Usage

Consider this interactive session:

s = Seg.new("/users/42")
#=> #<Seg ...>

s.prev
#=> ""

s.curr
#=> "/users/42"

s.consume("users")
#=> true

s.prev
#=> "/users"

s.curr
#=> "/42"

s.consume("42")
#=> true

s.prev
#=> "/users/42"

s.curr
#=> ""

The previous example shows how to walk the path by providing segments to consume. In the following example, we'll see what happens when we try to consume a segment with a string that doesn't match:

s = Seg.new("/users/42")
#=> #<Seg ...>

s.prev
#=> ""

s.curr
#=> "/users/42"

s.consume("admin")
#=> false

s.prev
#=> ""

s.curr
#=> "/users/42"

As you can see, the command fails and the prev and curr strings are not altered. Now we'll see how to capture segment values:

s = Seg.new("/users/42")
#=> #<Seg ...>

captures = Hash(Symbol, String).new
#=> {}

s.prev
#=> ""

s.curr
#=> "/users/42"

s.capture(:foo, captures)
#=> true

s.prev
#=> "/users"

s.curr
#=> "/42"

s.capture(:bar, captures)
#=> true

s.prev
#=> "/users/42"

s.curr
#=> ""

captures
#=> {:foo=>"users", :bar=>42}

It is also possible to extract the next segment from the path. The method extract returns the next segment, if available, or nil otherwise:

s = Seg.new("/users/42")
#=> #<Seg ...>

s.prev
#=> ""

s.curr
#=> "/users/42"

s.extract
#=> "users"

s.prev
#=> "/users"

s.curr
#=> "/42"

s.extract
#=> "42"

s.prev
#=> "/users/42"

s.curr
#=> ""

You can also go back by using the methods retract and restore, which are the antidote to extract and consume respectively.

Let's see how retract works:

s = Seg.new("/users/42")
#=> #<Seg ...>

s.prev
#=> ""

s.curr
#=> "/users/42"

s.extract
#=> "users"

s.prev
#=> "/users"

s.curr
#=> "/42"

s.retract
#=> "users"

s.prev
#=> ""

s.curr
#=> "/users/42"

And now restore:

s = Seg.new("/users/42")
#=> #<Seg ...>

s.prev
#=> ""

s.curr
#=> "/users/42"

s.extract
#=> "users"

s.prev
#=> "/users"

s.curr
#=> "/42"

s.restore("foo")
#=> false

s.restore("users")
#=> true

s.prev
#=> ""

s.curr
#=> "/users/42"

Installation

Add this to your application's shard.yml:

dependencies:
  seg:
    github: soveran/seg
    branch: master

About

Segment matcher for paths

Resources

License

Stars

Watchers

Forks

Packages

No packages published