# typed: strict module DataModel class Builtin::Time < Type include Errors class Arguments < T::Struct prop :optional, T::Boolean, default: false prop :earliest, T.nilable(::Time), default: nil prop :latest, T.nilable(::Time), default: nil end sig { override.params(val: Object, coerce: T::Boolean).returns(TTypeResult) } def read(val, coerce: false) args = Arguments.new(type_args) err = Error.new # missing, but allowed, don't do any more checks if val.nil? && args.optional return [val, err] end # missing, but not allowed, don't do any more checks if val.nil? err.add(missing_error(Time)) return [val, err] end # coercion is enabled, and the value is a string, try to parse it if val.is_a?(String) && coerce begin val = Time.parse(val) rescue ArgumentError err.add(type_error(Time, val)) return [val, err] end end # not a date, don't do any more checks if !val.is_a?(Time) err.add(type_error(Time, val)) return [val, err] end # date is before the earliest point allowed if args.earliest && (val < T.must(args.earliest)) error = earliest_error(T.must(args.earliest), val) err.add(error) end # date is after the latest point allowed if args.latest && (val > T.must(args.latest)) error = latest_error(T.must(args.latest), val) err.add(error) end return [val, err] end end end