l43_core 0.1.3 → 0.2.0

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: b964ad4c7819f22e58ec71b9768521105318d9bdcc42d9d860e399bd9864c491
4
- data.tar.gz: e6399e1a021ca7b549a0c41589e8e200891269e3099fe36a6a6cfd755c4e8ac7
3
+ metadata.gz: 3ed28ec7f327c806b60c2a37982ea75bd1778198cf46c29ca7c2aaae5e41deb2
4
+ data.tar.gz: 3b3dab1de7449f862280357770bf4c0d790350131590e8eabdf4ea8a4d1fd8f9
5
5
  SHA512:
6
- metadata.gz: 31d4957c4b081d12d22e3b8236f91bfeed7b93dc99941374d22ae421dd58aacdf2807ec7e7f70a1285be685714bcb53fab409f6dada9ca4125d5fd2a399de849
7
- data.tar.gz: ea5c0da5bac00c239e95c74f213cac1f88e321e78227bce9e7ef6bed7d079b25ca764d5d09d723cea00bcb51039a4f2264dd0768cdf82ba6a3eb66f7be40a403
6
+ metadata.gz: 5a31e995ba88b3f66e5aac6d18f968d6df7b4b126616a492c08230d0fb80262d33747c2360f19a14c4c1088dd46ea0eb46cf06d849a8b613026009c9efdd7e40
7
+ data.tar.gz: 550d88e2528a9b9e62fee8dc4f98d14f86a575827348f84eb489fa966d89a51a710930eca0bac2a2970f79be801768b15b0e1f73c50ee560e6e8197e16f7dcb1
@@ -4,27 +4,35 @@ require_relative 'result'
4
4
  module L43
5
5
  module Core
6
6
  module AsResult
7
- def self.extended(from)
8
- from.include self
7
+ include Result
8
+ def self.extended(by)
9
+ by.include self
9
10
  end
10
11
 
11
- def as_result(&blk)
12
- Result.ok(blk.())
12
+ def as_result(caller: nil, &blk)
13
+ Success.new(blk.())
13
14
  rescue StandardError => se
14
- Result.error(se.message)
15
+ Failure.new(
16
+ exception: se,
17
+ message: se.inspect,
18
+ location: [caller, se.backtrace_locations.first].compact.join(" ")
19
+ )
15
20
  end
16
21
 
17
- def as_result_fn(&blk)
18
- -> (*a, **k, &b) do
19
- as_result { blk.(*a, **k, &b) }
22
+ def defresult(name, &blk)
23
+ define_method(name) do |*a, **k, &b|
24
+ as_result(caller: name) do
25
+ blk.(*a, **k, &b)
26
+ end
20
27
  end
21
28
  end
22
29
 
23
- def defresult(name, &blk)
24
- define_method name do |*a, **k, &b|
25
- as_result { blk.(*a, **k, &b) }
30
+ def as_result_fn(&blk)
31
+ -> (v) do
32
+ as_result { blk.(v) }
26
33
  end
27
34
  end
35
+
28
36
  end
29
37
  end
30
38
  end
@@ -14,6 +14,13 @@ module L43
14
14
  def forward_all(*messages, to:)
15
15
  def_delegators(to, *messages)
16
16
  end
17
+
18
+ def forward_self(method:, to:, as: nil)
19
+ as ||= method
20
+ define_method(method) do |*a, **k, &b|
21
+ to.send(as, *[self, *a], **k, &b)
22
+ end
23
+ end
17
24
 
18
25
  end
19
26
  end
@@ -1,25 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'failure'
4
+ require_relative 'success'
3
5
  module L43
4
6
  module Core
5
- class Result
7
+ module Result
6
8
  module Constructors
7
- def error(message)
8
- o = allocate
9
- o.instance_exec do
10
- @message = message
11
- @ok = false
12
- end
13
- o
9
+ def error(message, exception: nil, location: nil)
10
+ Failure.new(message:, exception:, location:)
14
11
  end
15
12
 
16
13
  def ok(value)
17
- o = allocate
18
- o.instance_exec do
19
- @value = value
20
- @ok = true
21
- end
22
- o
14
+ Success.new(value)
23
15
  end
24
16
  end
25
17
  end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module L43
4
+ module Core
5
+ module Result
6
+ class Failure
7
+ include Result
8
+ attr_reader :exception, :location, :message
9
+
10
+ def error? = true
11
+ def ok? = false
12
+
13
+ def map(&_blk) = self
14
+
15
+ def map_result(&_blk) = self
16
+
17
+ def map_result!(&_blk) = self
18
+
19
+ def to_h(*) = {error: {exception:, location:, message:}}
20
+
21
+ def deconstruct(*) = [:error, [message, location].compact.join(" at ")]
22
+
23
+ private
24
+ def initialize(exception:, location:, message:)
25
+ @exception = exception
26
+ @location = location
27
+ @message = message
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ # SPDX-License-Identifier: AGPL-3.0-or-later
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module L43
4
+ module Core
5
+ module Result
6
+ module Helpers
7
+
8
+ def as_result(message=nil, &blk)
9
+ value = blk.()
10
+ Result.ok(value)
11
+
12
+ rescue StandardError => exception
13
+ location = blk.source_location.join(':')
14
+ Result.error(message, location:, exception:)
15
+ end
16
+
17
+ def as_result_fn(message=nil, &blk)
18
+ -> (*a, **k, &b) do
19
+ as_result(message) { blk.(*a, **k, &b) }
20
+ end
21
+ end
22
+
23
+ end
24
+ end
25
+ end
26
+ end
27
+ # SPDX-License-Identifier: AGPL-3.0-or-later
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module L43
4
+ module Core
5
+ module Result
6
+ class Success
7
+ include Result
8
+ attr_reader :value
9
+
10
+ def deconstruct(*) = [:ok, value]
11
+
12
+ def error? = false
13
+
14
+ def map(&blk)
15
+ blk.(self)
16
+ end
17
+
18
+ def map_result(&blk)
19
+ as_result('map_result') do
20
+ blk.(self)
21
+ end
22
+ end
23
+
24
+ def map_result!(&blk)
25
+ self.class.ok(blk.(self))
26
+ end
27
+
28
+ def ok? = true
29
+
30
+ def to_h(*)
31
+ {ok: @value}
32
+ end
33
+
34
+ private
35
+ def initialize(value)
36
+ @ok = true
37
+ @value = value
38
+ end
39
+
40
+ end
41
+ end
42
+ end
43
+ end
44
+ # SPDX-License-Identifier: AGPL-3.0-or-later
@@ -2,11 +2,15 @@
2
2
 
3
3
  require 'l43/errors'
4
4
  require_relative 'result/constructors'
5
+ require_relative 'result/failure'
6
+ require_relative 'result/helpers'
7
+ require_relative 'result/success'
5
8
 
6
9
  module L43
7
10
  module Core
8
- class Result
11
+ module Result
9
12
  extend Constructors
13
+ include Helpers
10
14
 
11
15
  def ==(other)
12
16
  return false unless self.class === other
@@ -14,36 +18,18 @@ module L43
14
18
  to_h == other.to_h
15
19
  end
16
20
 
17
- def deconstruct(*)
18
- if @ok
19
- [:ok, @value]
20
- else
21
- [:error, @message]
22
- end
23
- end
24
-
25
- def to_h(*)
26
- if @ok
27
- {ok: @value}
28
- else
29
- {error: @message}
30
- end
31
- end
32
- alias_method :deconstruct_keys, :to_h
33
-
34
- def error? = !@ok
21
+ def deconstruct_keys(*) = to_h
35
22
 
36
23
  def message!
37
- return @message unless @ok
38
- raise IllegalState, "No error message in an ok result"
24
+ raise IllegalState, "No error message in an ok result" if @ok
25
+ message
39
26
  end
40
27
 
41
- def ok? = @ok
42
-
43
28
  def value!
44
29
  return @value if @ok
45
30
  raise IllegalState, "No value in an error result"
46
31
  end
32
+ alias_method :value, :value!
47
33
  end
48
34
  end
49
35
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module L43
4
4
  module Core
5
- VERSION = "0.1.3"
5
+ VERSION = "0.2.0"
6
6
  end
7
7
  end
8
8
  # SPDX-License-Identifier: AGPL-3.0-or-later
data/lib/l43/core.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'core/as_result'
4
- require_relative 'core/result'
5
4
  module L43
6
5
  module Core extend self
7
6
 
data/lib/l43/errors.rb CHANGED
@@ -2,5 +2,6 @@
2
2
 
3
3
  module L43
4
4
  IllegalState = Class.new(RuntimeError)
5
+ AbstractMethod = Class.new(RuntimeError)
5
6
  end
6
7
  # SPDX-License-Identifier: AGPL-3.0-or-later
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: l43_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Dober
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-12-10 00:00:00.000000000 Z
10
+ date: 2026-03-27 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: ostruct
@@ -38,6 +38,9 @@ files:
38
38
  - lib/l43/core/none.rb
39
39
  - lib/l43/core/result.rb
40
40
  - lib/l43/core/result/constructors.rb
41
+ - lib/l43/core/result/failure.rb
42
+ - lib/l43/core/result/helpers.rb
43
+ - lib/l43/core/result/success.rb
41
44
  - lib/l43/core/version.rb
42
45
  - lib/l43/errors.rb
43
46
  - lib/l43/open_struct.rb
@@ -52,14 +55,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
52
55
  requirements:
53
56
  - - ">="
54
57
  - !ruby/object:Gem::Version
55
- version: 3.4.5
58
+ version: 4.0.1
56
59
  required_rubygems_version: !ruby/object:Gem::Requirement
57
60
  requirements:
58
61
  - - ">="
59
62
  - !ruby/object:Gem::Version
60
63
  version: '0'
61
64
  requirements: []
62
- rubygems_version: 4.0.1
65
+ rubygems_version: 4.0.3
63
66
  specification_version: 4
64
67
  summary: Core Functionality for L43 Ruby Tool
65
68
  test_files: []