1515module LeiosProtocol.Config where
1616
1717import Data.Aeson.Encoding (pairs )
18- import Data.Aeson.Key (fromString )
19- import Data.Aeson.Types (Encoding , FromJSON (.. ), KeyValue ((.=) ), Object , Parser , ToJSON (.. ), Value (.. ), object , typeMismatch , withObject , (.!=) , (.:) , (.:?) )
20- import Data.Char (isUpper , toLower , toUpper )
18+ import Data.Aeson.Types (Encoding , FromJSON (.. ), KeyValue ((.=) ), Parser , ToJSON (.. ), Value (.. ), object , typeMismatch , withObject , (.:) )
2119import Data.Default (Default (.. ))
2220import Data.Maybe (catMaybes )
2321import Data.Text (Text )
2422import GHC.Generics (Generic )
25- import GHC.Records (HasField (.. ))
26- import GHC.TypeLits (KnownSymbol (.. ), SSymbol , fromSSymbol )
23+ import JSONCompat (Getter , always , get , omitDefault , parseFieldOrDefault )
2724
2825newtype SizeBytes = SizeBytes { unSizeBytes :: Word }
2926 deriving newtype (Show , Eq , Ord , FromJSON , ToJSON , Num , Real , Enum , Integral )
@@ -38,19 +35,6 @@ data Distribution
3835 | LogNormal { mu :: Double , sigma :: Double }
3936 deriving (Show , Eq , Generic )
4037
41- kebabToCamel :: String -> String
42- kebabToCamel = go False
43- where
44- go _ [] = []
45- go _ (' -' : cs) = go True cs
46- go b (c : cs) = (if b then toUpper c else c) : go False cs
47-
48- camelToKebab :: String -> String
49- camelToKebab [] = []
50- camelToKebab (c : cs)
51- | isUpper c = ' -' : toLower c : camelToKebab cs
52- | otherwise = c : camelToKebab cs
53-
5438data Config = Config
5539 { leiosStageLengthSlots :: Word
5640 , leiosStageActiveVotingSlots :: Word
@@ -143,24 +127,6 @@ instance Default Config where
143127 , certSizeBytesPerNode = 32
144128 }
145129
146- newtype Getter r = Getter { unGetter :: forall f v e kv . SSymbol f -> (HasField f r v , KeyValue e kv , ToJSON v , Eq v ) => r -> Maybe kv }
147-
148- get :: forall fld obj e kv a . (KnownSymbol fld , HasField fld obj a , KeyValue e kv , ToJSON a , Eq a ) => Getter obj -> obj -> Maybe kv
149- get (Getter getter) = getter (symbolSing @ fld )
150-
151- always :: Getter r
152- always = Getter $ \ (fld :: SSymbol fld ) obj ->
153- let key = fromString (camelToKebab (fromSSymbol fld))
154- val = getField @ fld obj
155- in Just (key .= val)
156-
157- omitDefault :: Default r => Getter r
158- omitDefault = Getter $ \ (fld :: SSymbol fld ) obj ->
159- let key = fromString (camelToKebab (fromSSymbol fld))
160- getFld = getField @ fld
161- val = getFld obj
162- in if val == getFld def then Nothing else Just (key .= val)
163-
164130configToJSONWith :: Getter Config -> Config -> Value
165131configToJSONWith getter = object . configToKVsWith getter
166132
@@ -230,53 +196,49 @@ instance ToJSON (OmitDefault Config) where
230196 toEncoding :: OmitDefault Config -> Encoding
231197 toEncoding (OmitDefault cfg) = configToEncodingWith omitDefault cfg
232198
233- parseFieldOrDefault :: forall fld a . (HasField fld Config a , KnownSymbol fld , FromJSON a ) => Object -> Parser a
234- parseFieldOrDefault obj =
235- obj .:? fromString (camelToKebab (fromSSymbol (symbolSing @ fld ))) .!= getField @ fld (def :: Config )
236-
237199instance FromJSON Config where
238200 parseJSON = withObject " Config" $ \ obj -> do
239- leiosStageLengthSlots <- parseFieldOrDefault @ " leiosStageLengthSlots" obj
240- leiosStageActiveVotingSlots <- parseFieldOrDefault @ " leiosStageActiveVotingSlots" obj
241- txGenerationDistribution <- parseFieldOrDefault @ " txGenerationDistribution" obj
242- txSizeBytesDistribution <- parseFieldOrDefault @ " txSizeBytesDistribution" obj
243- txValidationCpuTimeMs <- parseFieldOrDefault @ " txValidationCpuTimeMs" obj
244- txMaxSizeBytes <- parseFieldOrDefault @ " txMaxSizeBytes" obj
245- rbGenerationProbability <- parseFieldOrDefault @ " rbGenerationProbability" obj
246- rbGenerationCpuTimeMs <- parseFieldOrDefault @ " rbGenerationCpuTimeMs" obj
247- rbHeadValidationCpuTimeMs <- parseFieldOrDefault @ " rbHeadValidationCpuTimeMs" obj
248- rbHeadSizeBytes <- parseFieldOrDefault @ " rbHeadSizeBytes" obj
249- rbBodyMaxSizeBytes <- parseFieldOrDefault @ " rbBodyMaxSizeBytes" obj
250- rbBodyLegacyPraosPayloadValidationCpuTimeMsConstant <- parseFieldOrDefault @ " rbBodyLegacyPraosPayloadValidationCpuTimeMsConstant" obj
251- rbBodyLegacyPraosPayloadValidationCpuTimeMsPerByte <- parseFieldOrDefault @ " rbBodyLegacyPraosPayloadValidationCpuTimeMsPerByte" obj
252- rbBodyLegacyPraosPayloadAvgSizeBytes <- parseFieldOrDefault @ " rbBodyLegacyPraosPayloadAvgSizeBytes" obj
253- ibGenerationProbability <- parseFieldOrDefault @ " ibGenerationProbability" obj
254- ibGenerationCpuTimeMs <- parseFieldOrDefault @ " ibGenerationCpuTimeMs" obj
255- ibHeadSizeBytes <- parseFieldOrDefault @ " ibHeadSizeBytes" obj
256- ibHeadValidationCpuTimeMs <- parseFieldOrDefault @ " ibHeadValidationCpuTimeMs" obj
257- ibBodyValidationCpuTimeMsConstant <- parseFieldOrDefault @ " ibBodyValidationCpuTimeMsConstant" obj
258- ibBodyValidationCpuTimeMsPerByte <- parseFieldOrDefault @ " ibBodyValidationCpuTimeMsPerByte" obj
259- ibBodyMaxSizeBytes <- parseFieldOrDefault @ " ibBodyMaxSizeBytes" obj
260- ibBodyAvgSizeBytes <- parseFieldOrDefault @ " ibBodyAvgSizeBytes" obj
261- ebGenerationProbability <- parseFieldOrDefault @ " ebGenerationProbability" obj
262- ebGenerationCpuTimeMs <- parseFieldOrDefault @ " ebGenerationCpuTimeMs" obj
263- ebValidationCpuTimeMs <- parseFieldOrDefault @ " ebValidationCpuTimeMs" obj
264- ebSizeBytesConstant <- parseFieldOrDefault @ " ebSizeBytesConstant" obj
265- ebSizeBytesPerIb <- parseFieldOrDefault @ " ebSizeBytesPerIb" obj
266- voteGenerationProbability <- parseFieldOrDefault @ " voteGenerationProbability" obj
267- voteGenerationCpuTimeMsConstant <- parseFieldOrDefault @ " voteGenerationCpuTimeMsConstant" obj
268- voteGenerationCpuTimeMsPerIb <- parseFieldOrDefault @ " voteGenerationCpuTimeMsPerIb" obj
269- voteValidationCpuTimeMs <- parseFieldOrDefault @ " voteValidationCpuTimeMs" obj
270- voteThreshold <- parseFieldOrDefault @ " voteThreshold" obj
271- voteOneEbPerVrfWin <- parseFieldOrDefault @ " voteOneEbPerVrfWin" obj
272- voteSizeBytesConstant <- parseFieldOrDefault @ " voteSizeBytesConstant" obj
273- voteSizeBytesPerNode <- parseFieldOrDefault @ " voteSizeBytesPerNode" obj
274- certGenerationCpuTimeMsConstant <- parseFieldOrDefault @ " certGenerationCpuTimeMsConstant" obj
275- certGenerationCpuTimeMsPerNode <- parseFieldOrDefault @ " certGenerationCpuTimeMsPerNode" obj
276- certValidationCpuTimeMsConstant <- parseFieldOrDefault @ " certValidationCpuTimeMsConstant" obj
277- certValidationCpuTimeMsPerNode <- parseFieldOrDefault @ " certValidationCpuTimeMsPerNode" obj
278- certSizeBytesConstant <- parseFieldOrDefault @ " certSizeBytesConstant" obj
279- certSizeBytesPerNode <- parseFieldOrDefault @ " certSizeBytesPerNode" obj
201+ leiosStageLengthSlots <- parseFieldOrDefault @ Config @ " leiosStageLengthSlots" obj
202+ leiosStageActiveVotingSlots <- parseFieldOrDefault @ Config @ " leiosStageActiveVotingSlots" obj
203+ txGenerationDistribution <- parseFieldOrDefault @ Config @ " txGenerationDistribution" obj
204+ txSizeBytesDistribution <- parseFieldOrDefault @ Config @ " txSizeBytesDistribution" obj
205+ txValidationCpuTimeMs <- parseFieldOrDefault @ Config @ " txValidationCpuTimeMs" obj
206+ txMaxSizeBytes <- parseFieldOrDefault @ Config @ " txMaxSizeBytes" obj
207+ rbGenerationProbability <- parseFieldOrDefault @ Config @ " rbGenerationProbability" obj
208+ rbGenerationCpuTimeMs <- parseFieldOrDefault @ Config @ " rbGenerationCpuTimeMs" obj
209+ rbHeadValidationCpuTimeMs <- parseFieldOrDefault @ Config @ " rbHeadValidationCpuTimeMs" obj
210+ rbHeadSizeBytes <- parseFieldOrDefault @ Config @ " rbHeadSizeBytes" obj
211+ rbBodyMaxSizeBytes <- parseFieldOrDefault @ Config @ " rbBodyMaxSizeBytes" obj
212+ rbBodyLegacyPraosPayloadValidationCpuTimeMsConstant <- parseFieldOrDefault @ Config @ " rbBodyLegacyPraosPayloadValidationCpuTimeMsConstant" obj
213+ rbBodyLegacyPraosPayloadValidationCpuTimeMsPerByte <- parseFieldOrDefault @ Config @ " rbBodyLegacyPraosPayloadValidationCpuTimeMsPerByte" obj
214+ rbBodyLegacyPraosPayloadAvgSizeBytes <- parseFieldOrDefault @ Config @ " rbBodyLegacyPraosPayloadAvgSizeBytes" obj
215+ ibGenerationProbability <- parseFieldOrDefault @ Config @ " ibGenerationProbability" obj
216+ ibGenerationCpuTimeMs <- parseFieldOrDefault @ Config @ " ibGenerationCpuTimeMs" obj
217+ ibHeadSizeBytes <- parseFieldOrDefault @ Config @ " ibHeadSizeBytes" obj
218+ ibHeadValidationCpuTimeMs <- parseFieldOrDefault @ Config @ " ibHeadValidationCpuTimeMs" obj
219+ ibBodyValidationCpuTimeMsConstant <- parseFieldOrDefault @ Config @ " ibBodyValidationCpuTimeMsConstant" obj
220+ ibBodyValidationCpuTimeMsPerByte <- parseFieldOrDefault @ Config @ " ibBodyValidationCpuTimeMsPerByte" obj
221+ ibBodyMaxSizeBytes <- parseFieldOrDefault @ Config @ " ibBodyMaxSizeBytes" obj
222+ ibBodyAvgSizeBytes <- parseFieldOrDefault @ Config @ " ibBodyAvgSizeBytes" obj
223+ ebGenerationProbability <- parseFieldOrDefault @ Config @ " ebGenerationProbability" obj
224+ ebGenerationCpuTimeMs <- parseFieldOrDefault @ Config @ " ebGenerationCpuTimeMs" obj
225+ ebValidationCpuTimeMs <- parseFieldOrDefault @ Config @ " ebValidationCpuTimeMs" obj
226+ ebSizeBytesConstant <- parseFieldOrDefault @ Config @ " ebSizeBytesConstant" obj
227+ ebSizeBytesPerIb <- parseFieldOrDefault @ Config @ " ebSizeBytesPerIb" obj
228+ voteGenerationProbability <- parseFieldOrDefault @ Config @ " voteGenerationProbability" obj
229+ voteGenerationCpuTimeMsConstant <- parseFieldOrDefault @ Config @ " voteGenerationCpuTimeMsConstant" obj
230+ voteGenerationCpuTimeMsPerIb <- parseFieldOrDefault @ Config @ " voteGenerationCpuTimeMsPerIb" obj
231+ voteValidationCpuTimeMs <- parseFieldOrDefault @ Config @ " voteValidationCpuTimeMs" obj
232+ voteThreshold <- parseFieldOrDefault @ Config @ " voteThreshold" obj
233+ voteOneEbPerVrfWin <- parseFieldOrDefault @ Config @ " voteOneEbPerVrfWin" obj
234+ voteSizeBytesConstant <- parseFieldOrDefault @ Config @ " voteSizeBytesConstant" obj
235+ voteSizeBytesPerNode <- parseFieldOrDefault @ Config @ " voteSizeBytesPerNode" obj
236+ certGenerationCpuTimeMsConstant <- parseFieldOrDefault @ Config @ " certGenerationCpuTimeMsConstant" obj
237+ certGenerationCpuTimeMsPerNode <- parseFieldOrDefault @ Config @ " certGenerationCpuTimeMsPerNode" obj
238+ certValidationCpuTimeMsConstant <- parseFieldOrDefault @ Config @ " certValidationCpuTimeMsConstant" obj
239+ certValidationCpuTimeMsPerNode <- parseFieldOrDefault @ Config @ " certValidationCpuTimeMsPerNode" obj
240+ certSizeBytesConstant <- parseFieldOrDefault @ Config @ " certSizeBytesConstant" obj
241+ certSizeBytesPerNode <- parseFieldOrDefault @ Config @ " certSizeBytesPerNode" obj
280242 pure Config {.. }
281243
282244distributionToKVs :: KeyValue e kv => Distribution -> [kv ]
0 commit comments