module Data.ProtoLens.Compiler.ModuleName
    ( protoModuleName ) where

import Data.Char (toUpper)
import Data.List (intercalate)
import System.FilePath

-- | Get the Haskell module name corresponding to a given .proto file.
protoModuleName :: FilePath -> String
protoModuleName path = fixModuleName rawModuleName
  where
    fixModuleName "" = ""
    -- Characters allowed in Bazel filenames but not in module names:
    fixModuleName ('.':c:cs) = '.' : toUpper c : fixModuleName cs
    fixModuleName ('_':c:cs) = toUpper c : fixModuleName cs
    fixModuleName ('-':c:cs) = toUpper c : fixModuleName cs
    fixModuleName (c:cs) = c : fixModuleName cs
    rawModuleName = intercalate "."
                        . (prefix :)
                        . splitDirectories $ dropExtension
                        $ path

prefix :: String
prefix = "Proto"