on 63243ca help sign in
51 lines 1.4 kB history raw
1{-# LANGUAGE DeriveDataTypeable #-}
2module Elm.Internal.Name where
4import Control.Applicative
5import Control.Monad.Error
6import Data.Aeson
7import Data.Binary
8import qualified Data.Text as T
9import qualified Data.Maybe as Maybe
10import Data.Typeable
12data Name = Name { user :: String, project :: String }
13 deriving (Typeable,Eq)
15instance Binary Name where
16 get = Name <$> get <*> get
17 put (Name user project) =
18 put user >> put project
20instance Show Name where
21 show name = user name ++ "/" ++ project name
23toFilePath :: Name -> FilePath
24toFilePath name = user name ++ "-" ++ project name
26fromString :: String -> Maybe Name
27fromString string =
28 case break (=='/') string of
29 ( user@(_:_), '/' : project@(_:_) )
30 | all (/='/') project -> Just (Name user project)
31 _ -> Nothing
33fromString' :: String -> ErrorT String IO Name
34fromString' string =
35 Maybe.maybe (throwError $ errorMsg string) return (fromString string)
37instance FromJSON Name where
38 parseJSON (String text) =
39 let string = T.unpack text in
40 Maybe.maybe (fail $ errorMsg string) return (fromString string)
42 parseJSON _ = fail "Project name must be a string."
44instance ToJSON Name where
45 toJSON name = toJSON (show name)
47errorMsg string =
48 unlines
49 [ "Dependency file has an invalid name: " ++ string
50 , "Must have format user/project and match a public github project."
51 ]