#!/usr/bin/env bash
set -euo pipefail

json_id() {
  sed -nE 's/.*"id"[[:space:]]*:[[:space:]]*(-?[0-9]+).*/\1/p' <<<"$1"
}

respond() {
  local id="$1"
  local result="$2"
  printf '{"id":%s,"jsonrpc":"2.0","result":%s}\n' "$id" "$result"
}

respond_error() {
  local id="$1"
  local message="$2"
  printf '{"error":{"code":-32601,"message":"%s"},"id":%s,"jsonrpc":"2.0"}\n' \
    "$message" "$id"
}

while IFS= read -r request; do
  [[ -n "$request" ]] || continue
  id="$(json_id "$request")"
  [[ -n "$id" ]] || continue

  case "$request" in
    *'"method":"plugin/activate"'*)
      respond "$id" '{"activated":true}'
      ;;
    *'"method":"plugin/command"'*)
      respond "$id" '{"message":"Hello from the Cairn Bash example."}'
      ;;
    *'"method":"plugin/panelAction"'*)
      respond "$id" '{"refreshed":true}'
      ;;
    *'"method":"plugin/shutdown"'*)
      respond "$id" '{"stopped":true}'
      exit 0
      ;;
    *)
      respond_error "$id" 'Method not found.'
      ;;
  esac
done
