unused-0.10.0.0: src/Unused/Projection.hs
module Unused.Projection where
import qualified Data.Bifunctor as BF
import Data.Monoid ((<>))
import Data.Text (Text)
import qualified Data.Text as T
import Data.Void (Void)
import Text.Megaparsec
import Text.Megaparsec.Char
import Unused.Projection.Transform
data ParsedTransform = ParsedTransform
{ ptPre :: Text
, ptTransforms :: [Transform]
, ptPost :: Text
}
type Parser = Parsec Void Text
translate :: Text -> Either String (Text -> Text)
translate template = applyTransform <$> parseTransform template
applyTransform :: ParsedTransform -> Text -> Text
applyTransform pt t = ptPre pt <> runTransformations t (ptTransforms pt) <> ptPost pt
parseTransform :: Text -> Either String ParsedTransform
parseTransform = BF.first show . parse parsedTransformParser ""
parsedTransformParser :: Parser ParsedTransform
parsedTransformParser =
ParsedTransform <$> preTransformsParser <*> transformsParser <*> postTransformsParser
preTransformsParser :: Parser Text
preTransformsParser = T.pack <$> manyTill anySingle (char '{')
transformsParser :: Parser [Transform]
transformsParser = transformParser `sepBy` char '|' <* char '}'
postTransformsParser :: Parser Text
postTransformsParser = T.pack <$> many anySingle
transformParser :: Parser Transform
transformParser = do
result <- string "camelcase" <|> string "snakecase"
return $
case result of
"camelcase" -> Camelcase
"snakecase" -> Snakecase
_ -> Noop