Jakie typy muszą być zdefiniowane dla ścieżki Yesod?
W mojej aplikacji mój model danych ma kilka różnych instancji użycia liczby całkowitej lub ciągu znaków dla niektórych identyfikatorów. Ze względów bezpieczeństwa poszedłem dalej i zapakowałem te identyfikatory w nowe deklaracje typu:
newtype DocId = DocId Integer
newtype GroupName = GroupName String
newtype UserName = UserName String
Kiedy konfiguruję moje ścieżki Yesod, odkrywam, że muszę utworzyć co najmniej trzy instancje dla każdego z nich, a instancje są prawie zawsze identyczne
instance Read DocId where
readsPrec prec val = case reads val of
(i, ""):_ -> [(DocId i, "")]
[] -> []
instance B.ToMarkup DocId where
toMarkup (DocId val) = B.toMarkup val
instance PathPiece DocId where
toPathPiece (DocId i) = T.pack $ show i
fromPathPiece s =
case reads $ T.unpack s of
(i, ""):_ -> Just i
[] -> Nothing
Ten tekst w kółko.
Co naprawdę muszę skonfigurować, aby zarówno wyświetlać mój typ danych w adresach URL (np. @ {ViewDocument docId}), jak i móc analizować te adresy?