module Bio.PDB.EventParser.ParseSpecListRecord(parseCOMPND, parseSOURCE)
where
import Prelude hiding(String)
import qualified Data.ByteString.Char8 as BS
import Bio.PDB.EventParser.PDBEvents
import Bio.PDB.EventParser.PDBParsingAbstractions
specListRecordFields = [
(6, mKeywords "record header" ["SOURCE", "COMPND"]),
(7, mSpc 1 ),
(10, dInt "continuation" 0 ),
(80, mStr "specification list" )]
parseSpecListRecord cons line line_no = return $
if errs /= []
then errs
else [result]
where
errs :: [PDBEvent]
errs = if fErrs /= [] then fErrs else pErrs
(fields, fErrs) = parseFields specListRecordFields line line_no
[fRec, _, fCont, fSpecList] = fields
IFInt cont = fCont
IFStr specListString = fSpecList
result = cons cont entries
entries = map entry preEntries
preEntries = map (BS.split ':') .
filter (/= "") $ ';' `BS.split` specListString
entry [a, b] = (a, b)
entry [ b] = ("", b)
pErrs :: [PDBEvent]
pErrs = concatMap checkEntry preEntries
checkEntry :: [String] -> [PDBEvent]
checkEntry [_, _] = []
checkEntry [ _] = []
checkEntry entry = [PDBParseError line_no 11
("Cannot parse specification list fragment: " `BS.append`
( BS.pack . show $ entry))]
parseCOMPND :: (Monad m) => String -> Int -> m [PDBEvent]
parseCOMPND = parseSpecListRecord COMPND
parseSOURCE :: (Monad m) => String -> Int -> m [PDBEvent]
parseSOURCE = parseSpecListRecord SOURCE