def validate.loop
mylsm-lsm-store@0.6.0.1 · src/ByteSstIo.bend:91
import mylsm-lsm-store@0.6.0.1/src/ByteSstIo.bend as ByteSstIo
import Base
import mylsm-lsm-store@0.6.0.1/src/scan/ByteBlockReader.bend as ByteBlockReader
91
92def validate.loop(
93 fuel: Nat,
94 state: ValidationState
95) -> IO(Result<&1, &1, U32 & String, ByteBlockReader.Metadata>):
96 match fuel:
97 case 0n:
98 match state:
99 case ValidateNeed{reader, _}:
100 do IO<Result<&1, &1, U32 & String, ByteBlockReader.Metadata>>:
101 _closed : Result<&1, &1, U32 & String, Unit> <-
102 ByteBlockReader.close(reader)
103 return Fail{corruption("byte SST validation exceeded its block budget")}
104 case ValidatePage{reader, _, _}:
105 do IO<Result<&1, &1, U32 & String, ByteBlockReader.Metadata>>:
106 _closed : Result<&1, &1, U32 & String, Unit> <-
107 ByteBlockReader.close(reader)
108 return Fail{corruption("byte SST validation exceeded its block budget")}
109 case ValidateStep{result, _}:
110 match result:
111 case Done{ByteBlockReader.Block{reader, _}}:
112 do IO<Result<&1, &1, U32 & String, ByteBlockReader.Metadata>>:
113 _closed : Result<&1, &1, U32 & String, Unit> <-
114 ByteBlockReader.close(reader)
115 return Fail{corruption("byte SST validation exceeded its block budget")}
116 case Fail{error}:
117 IO.pure(Result<&1, &1, U32 & String, ByteBlockReader.Metadata>, Fail{error})
118 case _: IO.pure(
119 Result<&1, &1, U32 & String, ByteBlockReader.Metadata>,
120 Fail{corruption("byte SST validation exhausted its transition limit")})
121 case 1n+rest:
122 match state:
123 case ValidateNeed{reader, metadata}:
124 do IO<Result<&1, &1, U32 & String, ByteBlockReader.Metadata>>:
125 result : Result<&1, &1, U32 & String, ByteBlockReader.Step> <-
126 ByteBlockReader.next(reader)
127 validate.loop(rest, ValidateStep{result, metadata})
128 case ValidatePage{reader, metadata, entries}:
129 validate.loop(rest, ValidateNeed{reader, validate.page(entries, metadata)})
130 case ValidateStep{result, metadata}:
131 match result:
132 case Fail{error}:
133 IO.pure(Result<&1, &1, U32 & String, ByteBlockReader.Metadata>, Fail{error})
134 case Done{ByteBlockReader.End{}}:
135 IO.pure(Result<&1, &1, U32 & String, ByteBlockReader.Metadata>, Done{metadata})
136 case Done{ByteBlockReader.Block{reader, entries}}:
137 validate.loop(rest, ValidatePage{reader, metadata, entries})