hprotoc 1.5.0 → 1.5.1
raw patch · 3 files changed
+42/−9 lines, 3 files
Files
- Text/ProtocolBuffers/ProtoCompile/MakeReflections.hs +3/−3
- Text/ProtocolBuffers/ProtoCompile/Resolve.hs +38/−5
- hprotoc.cabal +1/−1
Text/ProtocolBuffers/ProtoCompile/MakeReflections.hs view
@@ -211,7 +211,7 @@ TYPE_STRING -> Just parseDefString _ -> Just parseDefInteger case todo (utf8 bs) of- Nothing -> error $ "Could not parse as type "++ show t ++"the default value "++ show mayRawDef ++" for field "++show f+ Nothing -> error $ "Could not parse as type "++ show t ++" the default value (raw) is "++ show mayRawDef ++" for field "++show f Just value -> return value --- From here down is code used to parse the format of the default values in the .proto files@@ -244,8 +244,8 @@ parseDefInteger :: ByteString -> Maybe HsDefault parseDefInteger bs = fmap HsDef'Integer . mayRead checkSign . U.toString $ bs where checkSign = readSigned' checkBase- checkBase ('0':'x':xs) = readHex xs- checkBase ('0':xs) = readOct xs+ checkBase ('0':'x':xs@(_:_)) = readHex xs+ checkBase ('0':xs@(_:_)) = readOct xs checkBase xs = readDec xs parseDefBool :: ByteString -> Maybe HsDefault
Text/ProtocolBuffers/ProtoCompile/Resolve.hs view
@@ -66,7 +66,7 @@ import Data.Char import Data.Ratio import Data.Ix(inRange)-import Data.List(foldl',stripPrefix,lookup,isPrefixOf)+import Data.List(foldl',stripPrefix,lookup,isPrefixOf,isSuffixOf) import Data.Map(Map) import Data.Maybe(mapMaybe) import Data.Monoid(Monoid(..))@@ -108,6 +108,40 @@ getJust s ma@Nothing = throw $ "Impossible? Expected Just of type "++show (typeOf ma)++" but got nothing:\n"++indent s getJust _s (Just a) = return a +defaultPackageName :: Utf8+defaultPackageName = Utf8 (LC.pack "proto")++getPackage :: D.FileDescriptorProto -> Utf8+getPackage fdp = case D.FileDescriptorProto.package fdp of+ Just a -> a+ Nothing -> case D.FileDescriptorProto.name fdp of+ Nothing -> defaultPackageName+ Just filename -> case convertFileToPackage filename of+ Nothing -> defaultPackageName+ Just name -> name++-- | 'convertFileToPackage' mimics what I observe protoc --java_out do to convert the file name to a+-- class name.+convertFileToPackage :: Utf8 -> Maybe Utf8+convertFileToPackage filename =+ let full = toString filename+ suffix = ".proto"+ noproto = if suffix `isSuffixOf` full then take (length full - length suffix) full else full+ convert :: Bool -> String -> String+ convert _ [] = []+ convert toUp (x:xs) | inRange ('a','z') x = if toUp+ then toUpper x : convert False xs+ else x : convert False xs+ | inRange ('A','Z') x = x : convert False xs+ | inRange ('0','9') x = x : convert True xs+ | '_' == x = x : convert True xs+ | otherwise = convert True xs+ converted = convert True noproto+ leading = case converted of+ (x:_) | inRange ('0','9') x -> "proto_" ++ converted+ _ -> converted+ in if null leading then Nothing else (Just (fromString leading))+ -- This adds a leading dot if the input is non-empty joinDot :: [IName String] -> FIName String joinDot [] = err $ "joinDot on an empty list of IName!"@@ -439,14 +473,13 @@ -- makeOne :: D.FileDescriptorProto -> WriterT [(FIName Utf8,ProtoName)] (Either ErrStr) () makeOne fdp = do -- Create 'template' :: ProtoName using "Text.ProtocolBuffers.Identifiers"- rawPackage <- getJust "makeNameMap.makeOne: D.FileDescriptorProto.package"- (D.FileDescriptorProto.package fdp)+ let rawPackage = getPackage fdp lift (checkDIUtf8 rawPackage) -- guard-like effect let packageName = difi (DIName rawPackage) rawParent <- getJust "makeNameMap.makeOne: " . msum $ [ D.FileOptions.java_outer_classname =<< (D.FileDescriptorProto.options fdp) , D.FileOptions.java_package =<< (D.FileDescriptorProto.options fdp)- , D.FileDescriptorProto.package fdp]+ , Just (getPackage fdp)] diParent <- getJust ("makeNameMap.makeOne: invalid character in: "++show rawParent) (validDI rawParent) let hParent = map (mangle :: IName Utf8 -> MName String) . splitDI $ diParent@@ -1061,7 +1094,7 @@ parsed'fdp <- either (loadFailed toRead . show) return $ (parseProto (unCanonFP relpath) protoContents) packageName <- either (loadFailed toRead . show) (return . map iToString . snd) $- (checkDIUtf8 =<< getJust "makeTopLevel.packageName: you need a pacakge declaration in your proto file" (D.FileDescriptorProto.package parsed'fdp))+ (checkDIUtf8 (getPackage parsed'fdp)) -- =<< getJust "makeTopLevel.packageName: you need a pacakge declaration in your proto file" (D.FileDescriptorProto.package parsed'fdp)) let parents = Set.insert file parentsIn importList = map (fpCanonToLocal . CanonFP . toString) . F.toList . D.FileDescriptorProto.dependency $ parsed'fdp imports <- mapM (fmap getTL . load parents) importList
hprotoc.cabal view
@@ -1,5 +1,5 @@ name: hprotoc-version: 1.5.0+version: 1.5.1 cabal-version: >= 1.6 build-type: Simple license: BSD3