66use Relaticle \Flowforge \Exceptions \LastCharCantBeEqualToMinChar ;
77use Relaticle \Flowforge \Exceptions \MaxRankLength ;
88use Relaticle \Flowforge \Exceptions \PrevGreaterThanOrEquals ;
9- use Webmozart \Assert \Assert ;
109
1110use function array_filter ;
1211use function array_values ;
@@ -104,7 +103,7 @@ public static function after(self $prevRank): self
104103
105104 $ return = substr ($ prevRank ->get (), 0 , -1 ) . chr (ord ($ char ) + 1 );
106105
107- Assert:: stringNotEmpty ($ return );
106+ self :: ensureNonEmpty ($ return, ' after(): computed $return ' );
108107
109108 return self ::fromString ($ return );
110109 }
@@ -116,14 +115,14 @@ public static function before(self $nextRank): self
116115 if (ord ($ char ) - 1 <= ord (self ::MIN_CHAR )) {
117116 $ return = substr ($ nextRank ->get (), 0 , -1 ) . chr (ord ($ char ) - 1 ) . chr (ord (self ::MAX_CHAR ) - 1 );
118117
119- Assert:: stringNotEmpty ($ return );
118+ self :: ensureNonEmpty ($ return, ' before(): computed $return (edge case) ' );
120119
121120 return self ::fromString ($ return );
122121 }
123122
124123 $ return = substr ($ nextRank ->get (), 0 , -1 ) . chr (ord ($ char ) - 1 );
125124
126- Assert:: stringNotEmpty ($ return );
125+ self :: ensureNonEmpty ($ return, ' before(): computed $return ' );
127126
128127 return self ::fromString ($ return );
129128 }
@@ -153,7 +152,7 @@ public static function betweenRanks(self $prevRank, self $nextRank): self
153152 break ;
154153 }
155154
156- Assert:: stringNotEmpty ($ rank );
155+ self :: ensureNonEmpty ($ rank, ' betweenRanks(): computed $rank ' );
157156
158157 return self ::fromString ($ rank );
159158 }
@@ -167,7 +166,7 @@ private function getChar(int $i, string $defaultChar): string
167166 {
168167 $ return = $ this ->rank [$ i ] ?? $ defaultChar ;
169168
170- Assert:: stringNotEmpty ($ return );
169+ self :: ensureNonEmpty ($ return, ' getChar(): selected $return ' );
171170
172171 return $ return ;
173172 }
@@ -187,8 +186,20 @@ private static function mid(string $prev, string $next): string
187186
188187 $ return = chr ((int ) ((ord ($ prev ) + ord ($ next )) / 2 ));
189188
190- Assert:: stringNotEmpty ($ return );
189+ self :: ensureNonEmpty ($ return, ' mid(): computed $return ' );
191190
192191 return $ return ;
193192 }
193+
194+ /**
195+ * Ensure a string is non-empty at runtime; avoids relying on Webmozart Assert in production.
196+ *
197+ * @psalm-assert non-empty-string $value
198+ */
199+ private static function ensureNonEmpty (string $ value , string $ context ): void
200+ {
201+ if ($ value === '' ) {
202+ throw new \LogicException ('Rank invariant violated: ' . $ context . ' must be a non-empty string. ' );
203+ }
204+ }
194205}
0 commit comments