@@ -43,6 +43,7 @@ final private function __construct(
43
43
) {
44
44
// NOTE: 不変条件(invariant)
45
45
assert (static ::isValid ($ from , $ to )->isOk ());
46
+ assert (static ::isValidRange ($ from , $ to )->isOk ());
46
47
}
47
48
48
49
// -------------------------------------------------------------------------
@@ -97,32 +98,59 @@ final public static function tryFrom(
97
98
mixed $ to ,
98
99
): Result {
99
100
return static ::isValid ($ from , $ to )
101
+ ->andThen (static fn () => self ::isValidRange ($ from , $ to ))
100
102
->andThen (static fn () => Result \ok (static ::from ($ from , $ to )));
101
103
}
102
104
103
105
// -------------------------------------------------------------------------
104
106
// MARK: validation methods
105
107
// -------------------------------------------------------------------------
106
108
/**
107
- * 有効な値かどうか
109
+ * 日付範囲が有効であることを検証
108
110
*
109
111
* @param TStart $from 開始日付
110
112
* @param TEnd $to 終了日付
111
113
*
112
114
* @return Result<bool,ValueObjectError>
113
115
*/
114
- protected static function isValid (mixed $ from , mixed $ to ): Result
116
+ final protected static function isValidRange (mixed $ from , mixed $ to ): Result
115
117
{
116
- if ($ from ->isAfter ($ to )) {
117
- return Result \err (ValueObjectError::of (
118
- code: 'value_object.date_range.invalid_range ' ,
119
- message: '開始日付は終了日付以前である必要があります '
120
- ));
118
+ [$ isValidRange , $ errorCode , $ message ] = match (static ::rangeType ()) {
119
+ RangeType::CLOSED => [
120
+ $ from ->isBeforeOrEqualTo ($ to ),
121
+ 'value_object.date_range.invalid_range ' ,
122
+ '開始日付は終了日付以前である必要があります ' ,
123
+ ],
124
+ RangeType::OPEN ,
125
+ RangeType::HALF_OPEN_RIGHT ,
126
+ RangeType::HALF_OPEN_LEFT => [
127
+ $ from ->isBefore ($ to ),
128
+ 'value_object.date_range.invalid_range ' ,
129
+ '開始日付は終了日付より前である必要があります ' ,
130
+ ],
131
+ };
132
+
133
+ if (!$ isValidRange ) {
134
+ return Result \err (ValueObjectError::of (code: $ errorCode , message: $ message ));
121
135
}
122
136
123
137
return Result \ok (true );
124
138
}
125
139
140
+ /**
141
+ * 有効な値かどうか
142
+ * NOTE: 実装クラスでのオーバーライド用メソッド
143
+ *
144
+ * @param TStart $from 開始日付
145
+ * @param TEnd $to 終了日付
146
+ *
147
+ * @return Result<bool,ValueObjectError>
148
+ */
149
+ protected static function isValid (mixed $ from , mixed $ to ): Result
150
+ {
151
+ return Result \ok (true );
152
+ }
153
+
126
154
// -------------------------------------------------------------------------
127
155
// MARK: public methods
128
156
// -------------------------------------------------------------------------
0 commit comments