finished moving code into their respective library modules

This commit is contained in:
2024-11-09 21:47:27 +00:00
parent a9400d9079
commit a11efa624d
3 changed files with 129 additions and 118 deletions

View File

@@ -1,3 +1,3 @@
# rm -rf *pem client/ plugin/ server/ p2p/ p2prc.[pP]* config.json dist-newstyle/ &&\
rm -rf *pem client/ plugin/ server/ p2p/ p2prc.[pP]* config.json dist-newstyle/ &&\
cabal clean &&\
cabal run

View File

@@ -1,4 +1,111 @@
module API where
module API
( P2prAPI(..)
, MapPortRequest(..)
, getP2prcAPI
)
where
import System.Process ( ProcessHandle )
import Data.Aeson ( FromJSON )
import Error (IOEitherError)
import JSON
( IPAdressTable
, MapPortResponse
, P2prcConfig
)
import CLI
( StdInput(..)
, CLIOpt(..)
, eitherErrDecode
, getP2PrcCmd
, eitherExecProcess
, eitherExecProcessParser
, spawnProcP2Prc
)
import Environment ( cleanEnvironment )
data P2prAPI = MkP2prAPI
{ startServer :: IOEitherError ProcessHandle
, execInitConfig :: IOEitherError P2prcConfig
, execListServers :: IOEitherError IPAdressTable
, execMapPort :: MapPortRequest -> IOEitherError MapPortResponse
}
data MapPortRequest
= MkMapPortRequest Int String
getP2prcAPI :: IOEitherError P2prAPI
getP2prcAPI = do
cleanEnvironment
eitherP2prcCmd <- getP2PrcCmd
pure $ case eitherP2prcCmd of
(Right p2prcCmd) -> let
execProcP2PrcParser ::
FromJSON a =>
[CLIOpt] -> StdInput -> IOEitherError a
execProcP2PrcParser = eitherExecProcessParser p2prcCmd
-- TODO: GHC question, why does it scope down instead staying generic
execProcP2Prc = eitherExecProcess p2prcCmd
in do
Right $ MkP2prAPI
{ startServer = spawnProcP2Prc p2prcCmd [ MkOptAtomic "--s" ]
, execListServers =
execProcP2PrcParser [ MkOptAtomic "--ls" ] MkEmptyStdInput
, execMapPort =
\ (MkMapPortRequest portNumber _) ->
execProcP2PrcParser
[ MkOptTuple
( "--mp"
, show portNumber
)
-- , MkOptTuple -- TODO: add domain parameter
-- ( "--dm"
-- , domainName
-- )
]
MkEmptyStdInput
, execInitConfig = do
confInitRes <- execProcP2Prc [ MkOptAtomic "--dc" ] MkEmptyStdInput
case confInitRes of
(Right _) -> do
-- TODO: get config file name dynamically
-- TODO: change values before loading file
let fname = "/home/xecarlox/Desktop/p2p-rendering-computation/haskell/config.json" :: FilePath
-- TODO: read config check if file exists
configContent <- readFile fname
pure $ eitherErrDecode configContent
(Left err) -> pure $ Left err
}
(Left err) -> Left err
a=0

View File

@@ -2,74 +2,59 @@
module P2Prc ( runP2Prc ) where
import System.Process
( ProcessHandle
, terminateProcess
)
import System.Process ( terminateProcess )
import Control.Concurrent ( threadDelay )
import Data.Aeson ( FromJSON )
import Environment ( cleanEnvironment )
import Error (IOEitherError)
import JSON
( IPAdressTable
, MapPortResponse
, P2prcConfig
)
import CLI
( StdInput(..)
, CLIOpt(..)
, eitherErrDecode
, getP2PrcCmd
, eitherExecProcess
, eitherExecProcessParser
, spawnProcP2Prc
import API
( P2prAPI(..)
, MapPortRequest(..)
, getP2prcAPI
)
-- URGENT TASKS
--
--
-- TODO: splitting code on different files and directories
--
-- TODO: add Haddock documentation
--
-- TODO: P2PRC setup
-- p2prc runtime packaging
-- Perhaps create internal script to run P2PRC from nix flake
-- "nix flake run ..."
-- simplify packaging
-- check version P2PRC: only run if version if above a certain value
-- setup p2prc command
-- check if p2prc command is available in environment first
-- otherwise check folder above
--
-- TODO: Fix API TODOS
--
-- TODO: Fix JSON TODOS
--
-- create DSL to start and orchestrate network
--
-- TODO: publish haskell library
--
-- TODO: add use case examples (extra-source_files)
runP2Prc :: IO ()
runP2Prc = do
-- important but not urgent yet
--
-- TODO: Change Standard Library
-- TODO: add GDTA syntax to data types
-- TODO: need monad transformers to refactor the code
--
-- TODO: add quickcheck testing (quickchecking-dynamic)
--
-- TODO: parse IO arguments;
-- TODO: create DSL from the standard input
--
-- TODO: add use case examples (extra-source_files)
--
-- TODO: setup nix flake package
-- TODO: add quickcheck testing (quickchecking-dynamic)
-- Nix p2prc runtime packaging
-- Perhaps create internal script to run P2PRC from nix flake
-- "nix flake run ..."
-- simplify packaging
--
-- Extra:
--
@@ -140,84 +125,3 @@ runP2Prc = do
(Left err) -> print err
-- Module: API
data P2prAPI = MkP2prAPI
{ startServer :: IOEitherError ProcessHandle
, execInitConfig :: IOEitherError P2prcConfig
, execListServers :: IOEitherError IPAdressTable
, execMapPort :: MapPortRequest -> IOEitherError MapPortResponse
}
data MapPortRequest
= MkMapPortRequest Int String
getP2prcAPI :: IOEitherError P2prAPI
getP2prcAPI = do
cleanEnvironment
eitherP2prcCmd <- getP2PrcCmd
pure $ case eitherP2prcCmd of
(Right p2prcCmd) -> let
execProcP2PrcParser ::
FromJSON a =>
[CLIOpt] -> StdInput -> IOEitherError a
execProcP2PrcParser = eitherExecProcessParser p2prcCmd
-- TODO: GHC question, why does it scope down instead staying generic
execProcP2Prc = eitherExecProcess p2prcCmd
in do
Right $ MkP2prAPI
{ startServer = spawnProcP2Prc p2prcCmd [ MkOptAtomic "--s" ]
, execListServers =
execProcP2PrcParser [ MkOptAtomic "--ls" ] MkEmptyStdInput
, execMapPort =
\ (MkMapPortRequest portNumber _) ->
execProcP2PrcParser
[ MkOptTuple
( "--mp"
, show portNumber
)
-- , MkOptTuple -- TODO: add domain parameter
-- ( "--dm"
-- , domainName
-- )
]
MkEmptyStdInput
, execInitConfig = do
confInitRes <- execProcP2Prc [ MkOptAtomic "--dc" ] MkEmptyStdInput
case confInitRes of
(Right _) -> do
-- TODO: get config file name dynamically
-- TODO: change values before loading file
let fname = "/home/xecarlox/Desktop/p2p-rendering-computation/haskell/config.json" :: FilePath
-- TODO: read config check if file exists
configContent <- readFile fname
pure $ eitherErrDecode configContent
(Left err) -> pure $ Left err
}
(Left err) -> Left err