module JosieHealth module Utils struct Result(T) getter data : T? getter error : String? getter status_code : Int32 def initialize(@data : T?, @error : String?, @status_code : Int32 = 200) end def self.success(data : T, status_code : Int32 = 200) : Result(T) Result(T).new(data: data, error: nil, status_code: status_code) end def self.error(message : String, status_code : Int32 = 500) : Result(T) Result(T).new(data: nil, error: message, status_code: status_code) end def self.not_found(message : String = "Not found") : Result(T) Result(T).new(data: nil, error: message, status_code: 404) end def success? : Bool @error.nil? && @data != nil end def failure? : Bool !success? end def unwrap! : T @data.not_nil! end def unwrap_or(default : T) : T @data || default end def map(&block : T -> U) : Result(U) forall U if d = @data Result(U).success(yield d, @status_code) else Result(U).new(data: nil, error: @error, status_code: @status_code) end end end end end