मैंने एक डेमॉन बनाया था जिसमें एक बहुत ही आदिम रूप का इस्तेमाल किया गया था ipc(टेलनेट और एक स्ट्रिंग भेजें जिसमें कुछ शब्द निश्चित क्रम में हों)। मैं इसे से बाहर निकाल दिया और अब JSONएक Yesodसर्वर के लिए संदेश पारित करने के लिए उपयोग कर रहा हूँ । हालांकि, कुछ चीजें थीं जो मुझे वास्तव में मेरे डिजाइन के बारे में पसंद थीं, और मुझे यकीन नहीं है कि अब मेरी पसंद क्या है।
यहाँ मैं क्या कर रहा था:
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 में प्रत्येक फ़ंक्शन इस तरह दिखता था
foo :: Stage -> ReaderT Config IO ()
data Config = MkConfig (Either JobID Product) BaseDir JobMap
JobMapएक है TMVar Mapवर्तमान नौकरियों के बारे में है कि पटरियों जानकारी।
इसलिए अब, मेरे पास हैंडलर हैं, जो सभी इस तरह दिखते हैं
foo :: Handler RepJson
foo मेरे डेमॉन के लिए एक कमांड का प्रतिनिधित्व करता है, प्रत्येक हैंडलर को एक अलग JSON ऑब्जेक्ट को संसाधित करना पड़ सकता है।
जो मैं करना चाहता हूं वह एक JSONवस्तु भेजना है जो सफलता का प्रतिनिधित्व करती है, और एक और JSON ऑब्जेक्ट जो कुछ अपवाद के बारे में जानकारी की जासूसी करता है।
मैं चाहूंगा कि fooहेल्पर फंक्शन को वापस करने में सक्षम हो Either, लेकिन मुझे यकीन नहीं है कि मुझे यह कैसे मिलेगा, साथ ही, मेरे कार्यों की सूची के मूल्यांकन को समाप्त करने की क्षमता buildSeq।
यहाँ एकमात्र विकल्प है जो मैं देख रहा हूँ
1) सुनिश्चित करें कि exceptionHandlerहैंडलर में है। रिकॉर्ड JobMapमें डाल Appदिया। अपवाद के बारे में विवरणों getYesodको JobMapइंगित करने में उचित मूल्य में परिवर्तन का उपयोग करना , जिसे तब तक पहुँचा जा सकता हैfoo
क्या कोई बेहतर तरीका है?
मेरे अन्य विकल्प क्या हैं?
संपादित करें: स्पष्टता के लिए, मैं की भूमिका की व्याख्या करूंगा Handler RepJson। सर्वर किसी तरह जैसे आदेशों को स्वीकार करने की जरूरत है build stop report। क्लाइंट को इन कमांड्स के परिणामों को जानने का कोई तरीका चाहिए। मैंने JSON को उस माध्यम के रूप में चुना है जिसके साथ सर्वर और क्लाइंट एक दूसरे के साथ संवाद करते हैं। मैं केवल JSON / को प्रबंधित करने के लिए हैंडलर प्रकार का उपयोग कर रहा हूं और इससे अधिक कुछ नहीं।