Models.hs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. module Models where
  2. import Data.Monoid
  3. import Language.Haskell.TH
  4. import qualified Data.Text as Text
  5. import Database.Persist.Quasi
  6. import Database.Persist.TH
  7. import Database.Persist.Sql
  8. mkPersist' :: [EntityDef] -> IO [Dec]
  9. mkPersist' = runQ . mkPersist sqlSettings
  10. parseReferences' :: String -> IO Exp
  11. parseReferences' = runQ . parseReferencesQ
  12. parseReferencesQ :: String -> Q Exp
  13. parseReferencesQ = parseReferences lowerCaseSettings . Text.pack
  14. -- | # of models, # of fields
  15. mkModels :: Int -> Int -> String
  16. mkModels = mkModelsWithFieldModifier id
  17. mkNullableModels :: Int -> Int -> String
  18. mkNullableModels = mkModelsWithFieldModifier maybeFields
  19. mkModelsWithFieldModifier :: (String -> String) -> Int -> Int -> String
  20. mkModelsWithFieldModifier k i f =
  21. unlines . fmap unlines . take i . map mkModel . zip [0..] . cycle $
  22. [ "Model"
  23. , "Foobar"
  24. , "User"
  25. , "King"
  26. , "Queen"
  27. , "Dog"
  28. , "Cat"
  29. ]
  30. where
  31. mkModel :: (Int, String) -> [String]
  32. mkModel (i', m) =
  33. (m <> show i') : indent 4 (map k (mkFields f))
  34. indent :: Int -> [String] -> [String]
  35. indent i = map (replicate i ' ' ++)
  36. mkFields :: Int -> [String]
  37. mkFields i = take i $ map mkField $ zip [0..] $ cycle
  38. [ "Bool"
  39. , "Int"
  40. , "String"
  41. , "Double"
  42. , "Text"
  43. ]
  44. where
  45. mkField :: (Int, String) -> String
  46. mkField (i', typ) = "field" <> show i' <> "\t\t" <> typ
  47. maybeFields :: String -> String
  48. maybeFields = (++ " Maybe")