Saya telah membuat daemon yang menggunakan bentuk yang sangat primitif ipc
(telnet dan mengirim String yang memiliki kata-kata tertentu dalam urutan tertentu). Saya membentaknya dan sekarang menggunakan JSON
untuk meneruskan pesan ke Yesod
server. Namun, ada beberapa hal yang sangat saya sukai dari desain saya, dan saya tidak yakin apa pilihan saya sekarang.
Inilah yang saya lakukan:
buildManager :: Phase -> IO ()
buildManager phase = do
let buildSeq = findSeq phase
jid = JobID $ pack "8"
config = MkConfig $ Just jid
flip C.catch exceptionHandler $
runReaderT (sequence_ $ buildSeq <*> stages) config
-- ^^ I would really like to keep the above line of code, or something like it.
return ()
setiap fungsi di buildSeq terlihat seperti ini
foo :: Stage -> ReaderT Config IO ()
data Config = MkConfig (Either JobID Product) BaseDir JobMap
JobMap
adalah TMVar Map
yang melacak informasi tentang pekerjaan saat ini.
jadi sekarang, yang saya punya adalah Penangan, semuanya terlihat seperti ini
foo :: Handler RepJson
foo
mewakili perintah untuk daemon saya, setiap penangan mungkin harus memproses objek JSON yang berbeda.
Yang ingin saya lakukan adalah mengirim satu JSON
objek yang mewakili kesuksesan, dan objek JSON lain yang menekankan informasi tentang beberapa pengecualian.
Saya ingin foo
fungsi helper dapat mengembalikan Either
, tetapi saya tidak yakin bagaimana saya mendapatkannya, ditambah kemampuan untuk menghentikan evaluasi daftar tindakan saya , buildSeq
.
Inilah satu-satunya pilihan yang saya lihat
1) pastikan exceptionHandler
ada di Handler. Masukan JobMap
dalam App
catatan. Menggunakan getYesod
mengubah nilai yang sesuai dalam JobMap
menunjukkan detail tentang pengecualian, yang kemudian dapat diakses olehfoo
Apakah ada cara yang lebih baik?
Apa pilihan saya yang lain?
Edit: Untuk kejelasan, saya akan menjelaskan peran Handler RepJson
. Server membutuhkan beberapa cara untuk menerima perintah seperti build
stop
report
. Klien membutuhkan beberapa cara untuk mengetahui hasil dari perintah ini. Saya telah memilih JSON sebagai media yang berkomunikasi dengan server dan klien satu sama lain. Saya menggunakan tipe Handler hanya untuk mengelola JSON masuk / keluar dan tidak lebih.