Çok ilkel bir biçim ipc
(telnet ve belirli kelimeleri belirli bir sırayla içeren bir String gönder) kullanan bir arka plan programı oluşturmuştum . Bundan kurtuldum ve şimdi JSON
iletileri bir Yesod
sunucuya iletmek için kullanıyorum . Ancak, tasarımımda gerçekten sevdiğim bazı şeyler vardı ve şu anda seçimlerimin ne olduğundan emin değilim.
İşte yaptığım şey:
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 ()
buildSeq'teki her işlev şöyle görünüyordu
foo :: Stage -> ReaderT Config IO ()
data Config = MkConfig (Either JobID Product) BaseDir JobMap
JobMap
Bir olan TMVar Map
cari işler hakkında o izler bilgiler.
öyleyse şimdi, elimde olan İşleyiciler, hepsi buna benziyor
foo :: Handler RepJson
foo
arka plan programım için bir komutu temsil ediyor, her işleyicinin farklı bir JSON nesnesini işlemesi gerekebilir.
Yapmak istediğim şey, JSON
başarıyı temsil eden bir nesne ve bazı istisnalar hakkında bilgi veren başka bir JSON nesnesi göndermek.
Ben istiyorum foo
ın yardımcı işlevi bir dönüş yapabilmek için Either
, ama ben, bu olsun, artı eylemlerin listemde değerlendirilmesi sonlandırmak için yeteneği emin değilim buildSeq
.
İşte gördüğüm tek seçenek
1) exceptionHandler
İşleyicide olduğundan emin olun . Put JobMap
in App
rekor. Kullanımı getYesod
uygun değeri değiştirmez JobMap
sonra ulaşılabilir durum hakkında detayları gösteren,foo
Daha iyi bir yol var mı?
Diğer seçeneklerim neler?
Düzenleme: Netlik için rolünü açıklayacağım Handler RepJson
. Sunucunun, gibi komutları kabul etmesi için bir yola ihtiyacı var build
stop
report
. Müşterinin bu komutların sonuçlarını bilmek için bir şekilde ihtiyacı vardır. Sunucu ve istemcinin birbiriyle iletişim kurduğu ortam olarak JSON'u seçtim. İşleyici türünü sadece JSON giriş / çıkışını yönetmek için kullanıyorum ve daha fazlasını yapmıyorum.