l43_peg 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7a76ce58e24c47be7c8bcc43fa66e0e6c83792093c3edf5c5d4522c1c41c265a
4
- data.tar.gz: 3325ace69ada2bf3c260ccbb0c4b600f8012b6c81e76f6c81dfdf37b105bfa1e
3
+ metadata.gz: 5f907b8eabe5792c161d63a9d10519bd5166e1afa42e699b7ee73db66757a74f
4
+ data.tar.gz: 205a833fac0729863834d7f1e77ccb818ee94f2d6ca535bd600563353976a8e2
5
5
  SHA512:
6
- metadata.gz: b1efed5517e960dfd1365e9f5875c6bc212d6cf885444ced2616aa627105658821c5daf7ecacee7f9b52ee3b17fe264878dfbe211a7c176c3a8de949fb6bc764
7
- data.tar.gz: e90512b9b8d7193c802047e074338155fe949221ae86ef9961ccfdaa1868a0285626b63318a1ea8e8603a94b0a67a2eed47d88eafbe121dd2c5538612c348471
6
+ metadata.gz: aacdb7f6bde686be38585708fa1c7e5f3f0f91d0ec3559eb763cf25da379a1feb466b8b73fb9170d4583f8a034af333ad679f078cb8bf62313b0cacec7a4a548
7
+ data.tar.gz: 543f1f6452d764638ebde4fbe77e3e0d3d05fec4fee10982c9adeec0ebccfafcc91b4f2412775617910dfe4767dff2325846a23a77f5dd57a9959c47d971626e
data/lib/l43_peg/box.rb CHANGED
@@ -5,11 +5,24 @@ module L43Peg
5
5
  module Box
6
6
  attr_reader :value
7
7
 
8
- def self.make(class_name)
9
- klass = Object.const_get(class_name) if Object.const_defined?(class_name)
10
- raise NotABox, "#{class_name} is already defined but not a Box!" if klass && !(klass < self)
11
- klass = Object.const_set(class_name, Class.new.include(self)) unless klass
12
- klass
8
+ class << self
9
+ def make(class_name)
10
+ case class_name
11
+ when String, Symbol
12
+ make_new(class_name)
13
+ when Class
14
+ class_name
15
+ else
16
+ raise ArgumentError, "need a string, symbol or class, got: #{class_name.inspect}"
17
+ end
18
+ end
19
+
20
+ def make_new(class_name)
21
+ klass = Object.const_get(class_name) if Object.const_defined?(class_name)
22
+ raise NotABox, "#{class_name} is already defined but not a Box!" if klass && !(klass < self)
23
+ klass = Object.const_set(class_name, Class.new.include(self)) unless klass
24
+ klass
25
+ end
13
26
  end
14
27
 
15
28
  def deconstruct_keys(*) = {class: self, value:}
@@ -38,7 +38,7 @@ module L43Peg
38
38
  # end
39
39
  # return succeed_parser(ast:, rest: curr_input.drop, parsed:)
40
40
  in bad_result
41
- Errors.bad_result(bad_result.inspect)
41
+ Errors.bad_parser_result("from parser #{parser.name.inspect} in many: #{bad_result.inspect}")
42
42
  end
43
43
  end
44
44
  end
@@ -5,9 +5,7 @@ module L43Peg
5
5
  module Map extend self
6
6
  def map(parser, name: nil, fn: nil, box: nil, &mapper)
7
7
  raise ArgumentError, "must not provide keyword parameter fn and a block" if fn && mapper
8
- mapper = fn || mapper
9
- raise ArgumentError, "must provide one of the keyword parameters [fn:, box:] or a block" unless mapper || box
10
- mapper ||= :itself
8
+ mapper = fn || mapper || :itself
11
9
  Parser.new(name || "map(#{parser.name})") {|input, name=nil| _map(input:, name:, parser:, box:, mapper:)}
12
10
  end
13
11
 
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'l43_peg/combinators/many'
4
+ module L43Peg
5
+ module Combinators
6
+ module Maybe extend self
7
+ def maybe(parser, name: nil, &mapper)
8
+ Many
9
+ .many(parser, name:, max: 1)
10
+ .map(&:first)
11
+ .map(&mapper)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ # SPDX-License-Identifier: AGPL-3.0-or-later
@@ -11,7 +11,7 @@ module L43Peg
11
11
  if mapper
12
12
  parser.map(name:, box:, &mapper)
13
13
  elsif box
14
- parser.map(name) { Box.make(box).new(it) }
14
+ parser.boxed(box)
15
15
  else
16
16
  parser
17
17
  end
@@ -8,6 +8,7 @@ require "l43_peg/combinators/lazy"
8
8
  require "l43_peg/combinators/many"
9
9
  require "l43_peg/combinators/map"
10
10
  require "l43_peg/combinators/map_error"
11
+ require "l43_peg/combinators/maybe"
11
12
  require "l43_peg/combinators/satisfy"
12
13
  require "l43_peg/combinators/sequence"
13
14
 
@@ -36,6 +37,9 @@ module L43Peg
36
37
  def map_error(parser, name: nil, reason: nil) =
37
38
  MapError.map_error(parser, name:, reason:)
38
39
 
40
+ def maybe(parser, name: nil, &mapper) =
41
+ Maybe.maybe(parser, name:, &mapper)
42
+
39
43
  def satisfy(parser, name: nil, fn: nil, &satisfier) =
40
44
  Satisfy.satisfy(parser, name:, fn:, &satisfier)
41
45
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module L43Peg
4
- VERSION = '0.3.0'
4
+ VERSION = '0.3.2'
5
5
  end
6
6
  # SPDX-License-Identifier: AGPL-3.0-or-later
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: l43_peg
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Dober
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2026-04-29 00:00:00.000000000 Z
10
+ date: 2026-05-01 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: l43_open_object
@@ -60,6 +60,7 @@ files:
60
60
  - lib/l43_peg/combinators/many.rb
61
61
  - lib/l43_peg/combinators/map.rb
62
62
  - lib/l43_peg/combinators/map_error.rb
63
+ - lib/l43_peg/combinators/maybe.rb
63
64
  - lib/l43_peg/combinators/satisfy.rb
64
65
  - lib/l43_peg/combinators/sequence.rb
65
66
  - lib/l43_peg/errors.rb
@@ -97,7 +98,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
97
98
  requirements:
98
99
  - - ">="
99
100
  - !ruby/object:Gem::Version
100
- version: 4.0.1
101
+ version: 4.0.2
101
102
  required_rubygems_version: !ruby/object:Gem::Requirement
102
103
  requirements:
103
104
  - - ">="