packages feed

nixfmt-0.3.0: js/JSInterface.hs

{- © 2019 Serokell <hi@serokell.io>
 -
 - SPDX-License-Identifier: MPL-2.0
 -}

{-# LANGUAGE OverloadedStrings #-}
import GHCJS.Marshal
import GHCJS.Foreign
import GHCJS.Foreign.Callback
import GHCJS.Types
import JavaScript.Object
import qualified JavaScript.Object.Internal as O
import Data.JSString.Text
import qualified Data.JSString as S

import Nixfmt

foreign import javascript unsafe "window.nixfmt_ = $1"
    js_set_logic :: JSVal -> IO ()

main :: IO ()
main = do
    callback <- syncCallback2 ThrowWouldBlock $ \text_ o -> do
        let obj = O.Object o
        Just width <- getProp (textToJSString "width") obj >>= fromJSVal
        Just filename_ <- getProp (textToJSString "filename") obj >>= fromJSVal
        let filename = S.unpack filename_
        let text = textFromJSVal text_
        out <- case format width filename text of
          Left err -> do
            setProp "err" (toJSBool True) obj
            toJSVal $ S.pack $ errorBundlePretty err
          Right out_ -> do
            setProp "err" (toJSBool False) obj
            toJSVal out_
        setProp "ret" out obj
    js_set_logic $ jsval callback