Files
news.gitea.happylizard.me/bin/gems/facets-3.1.0/lib/standard/facets/ostruct/to_ostruct.rb
T
pizza2d1 4cee170d66
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 9s
Add bin and edit workflow
2026-09-16 13:11:16 -06:00

66 lines
1.7 KiB
Ruby

require 'ostruct'
class OpenStruct
#
def to_ostruct
self
end
end
class Hash
# Turns a hash into a generic object using an OpenStruct.
#
# o = {'a' => 1}.to_ostruct
# o.a #=> 1
#
def to_ostruct
OpenStruct.new(self)
end
## Recursively converts a Hash object to an OpenStruct object.
##
## Returns a copy of the hash as an OpenStruct.
#def to_ostruct()
# struct = OpenStruct.new(self.clone())
# each do |k, v|
# struct.__send__("#{k}=", v.to_ostruct()) if v.is_a?(Hash)
# struct.__send__(k).map! {|x| x.is_a?(Hash) ? x.to_ostruct() : x} if v.is_a?(Array)
# end
# return struct
#end
# Like `#to_ostruct` but recusively objectifies all hash elements as well.
#
# o = {'a' => { 'b' => 1 }}.to_ostruct_recurse
# o.a.b #=> 1
#
# The `exclude` parameter is used internally to prevent infinite
# recursion and is not intended to be utilized by the end-user.
# But for more advance use, if there is a particular subhash you
# would like to prevent from being converted to an OpoenStruct
# then include it in the `exclude` hash referencing itself. e.g.
#
# h = { 'a' => { 'b' => 1 } }
# o = h.to_ostruct_recurse( { h['a'] => h['a'] } )
# o.a['b'] #=> 1
#
# CREDIT: Alison Rowland, Jamie Macey, Mat Schaffer
def to_ostruct_recurse(exclude={})
return exclude[self] if exclude.key?( self )
o = exclude[self] = OpenStruct.new
h = self.dup
each_pair do |k,v|
h[k] = v.to_ostruct_recurse( exclude ) if v.respond_to?(:to_ostruct_recurse)
end
o.merge!(h)
end
end
class NilClass
# Create an empty OpenStruct object.
def to_ostruct
OpenStruct.new
end
end