/-  lsp-sur=language-server
/+  auto=language-server-complete
=>
|%
++  snippet
  |=  [rune=tape text=tape]
  ^-  json
  =,  enjs:format
  %-  pairs
  :~  'label'^(tape rune)
      'insertTextFormat'^(numb 2)
      'insertText'^(tape text)
  ==
::
++  runes
  ^-  (list (option:auto tape))
  :~  :-  '|$'
      """
        $\{1:sample}
      $\{2:body}
      """
      :-  '|_'
      """
        $\{1:sample}
      ++  $\{2:arm}
        $\{3:body}
      --
      """
      :-  '|:'
      """
        $\{1:sample}
      $\{2:body}
      """
      :-  '|%'
      """

      ++  $\{1:arm}
        $\{2:body}
      --
      """
      :-  '|.'
      """
        $\{1:body}
      """
      :-  '|^'
      """

      $\{1:body}
      ::
      ++  $\{2:arm}
        $\{3:body}
      --
      """
      :-  '|-'
      """
        $\{1:body}
      """
      :-  '|~'
      """
        $\{1:sample}
      $\{2:body}
      """
      :-  '|*'
      """
        $\{1:sample}
      $\{2:body}
      """
      :-  '|='
      """
        $\{1:sample}
      $\{2:body}
      """
      :-  '|@'
      """
      ++  $\{1:arm}
        $\{2:body}
      --
      """
      :-  '|?'
      """
        $\{1:sample}
      """
  ::
      :-  ':_'
      """
        $\{1:tail}
      $\{2:head}
      """
      :-  ':^'
      """
          $\{1:car}
          $\{2:cadr}
        $\{3:caddr}
      $\{4:cddr}
      """
      :-  ':-'
      """
        $\{1:tail}
      $\{2:head}
      """
      :-  ':+'
      """
        $\{1:car}
        $\{2:cadr}
      $\{3:cddr}
      """
      :-  ':~'
      """
        $\{1:item}
      ==
      """
      :-  ':*'
      """
        $\{1:item}
      ==
      """
  ::
      :-  '%_'
      """
        $\{1:target}
        $\{2:wing}  $\{3:new-value}
      ==
      """
      :-  '%.'
      """
        $\{1:arg}
      $\{2:gate}
      """
      :-  '%-'
      """
        $\{1:gate}
      $\{2:arg}
      """
      :-  '%:'
      """
        $\{1:gate}
        $\{2:args}
      ==
      """
      :-  '%*'
      """
        $\{1:target-wing}  $\{2:from}
        $\{3:wing}  $\{4:new-value}
      ==
      """
      :-  '%^'
      """
          $\{1:gate}
          $\{2:arg1}
        $\{3:arg2}
      $\{4:arg3}
      """
      :-  '%+'
      """
        $\{1:gate}
        $\{2:arg1}
      $\{3:arg2}
      """
      :-  '%~'
      """
        $\{1:arm}
        $\{2:core}
      $\{3:arg}
      """
      :-  '%='
      """
        $\{1:target}
        $\{2:wing}  $\{3:new-value}
      ==
      """
  ::
      :-  '.^'
      """
        $\{1:mold}
      $\{2:path}
      """
      :-  '.+'
      """
        $\{1:atom}
      """
      :-  '.*'
      """
        $\{1:subject}
      $\{2:formula}
      """
      :-  '.='
      """
        $\{1:a}
      $\{2:b}
      """
      :-  '.?'
      """
        $\{1:noun}
      """
  ::
      :-  '^|'
      """
        $\{1:iron-core}
      """
      :-  '^%'
      """
        $\{1:body}
      """
      :-  '^.'
      """
        $\{1:a}
      $\{2:b}
      """
      :-  '^+'
      """
        $\{1:like}
      $\{2:body}
      """
      :-  '^-'
      """
        $\{1:type}
      $\{2:body}
      """
      :-  '^&'
      """
        $\{1:zinc-core}
      """
      :-  '^~'
      """
        $\{1:constant}
      """
      :-  '^='
      """
        $\{1:face}
      $\{2:body}
      """
      :-  '^?'
      """
        $\{1:lead-core}
      """
      :-  '^*'
      """
        $\{1:type}
      """
      :-  '^:'
      """
        $\{1:type}
      """
  ::
      :-  '~|'
      """
        $\{1:trace}
      $\{2:body}
      """
      :-  '~_'
      """
        $\{1:tank}
      $\{2:body}
      """
      :-  '~%'
      """
          $\{1:name}
          $\{2:parent}
        ~
      $\{3:body}
      """
      :-  '~/'
      """
        $\{1:name}
      $\{2:body}
      """
      :-  '~<'
      """
        $\{1:hint}
      $\{2:body}
      """
      :-  '~>'
      """
        $\{1:hint}
      $\{2:body}
      """
      :-  '~$'
      """
        $\{1:name}
      $\{2:body}
      """
      :-  '~+'
      """

      $\{1:body}
      """
      :-  '~&'
      """
        $\{1:printf}
      $\{2:body}
      """
      :-  '~='
      """
        $\{1:a}
      $\{2:b}
      """
      :-  '~?'
      """
        $\{1:condition}
        $\{2:printf}
      $\{3:body}
      """
      :-  '~!'
      """
        $\{1:type}
      $\{2:body}
      """
  ::
      :-  ';='
      """
        $\{1:manx}
      ==
      """
      :-  ';:'
      """
        $\{1:gate}
        $\{2:args}
      ==
      """
      :-  ';/'
      """
        $\{1:tape}
      """
      :-  ';<'
      """
        $\{1:type}  bind:m  $\{2:body1}
      $\{3:body2}
      """
      :-  ';~'
      """
        $\{1:gate}
        $\{2:args}
      ==
      """
      :-  ';;'
      """
        $\{1:type}
      $\{2:body}
      """
  ::
      :-  '=|'
      """
        $\{1:type}
      $\{2:body}
      """
      :-  '=:'
      """
        $\{1:wing}  $\{2:value}
        ==
      $\{3:body}
      """
      :-  '=/'
      """
        $\{1:face}
        $\{2:value}
      $\{3:body}
      """
      :-  '=;'
      """
        $\{1:face}
        $\{2:body}
      $\{3:value}
      """
      :-  '=.'
      """
        $\{1:wing}
        $\{2:value}
      $\{3:body}
      """
      :-  '=?'
      """
        $\{1:wing}  $\{2:condition}
        $\{3:value}
      $\{4:body}
      """
      :-  '=<'
      """
        $\{1:formula}
      $\{2:subject}
      """
      :-  '=-'
      """
        $\{1:body}
      $\{2:value}
      """
      :-  '=>'
      """
        $\{1:subject}
      $\{2:formula}
      """
      :-  '=^'
      """
        $\{1:face}  $\{2:wing}
        $\{3:computation}
      $\{4:body}
      """
      :-  '=+'
      """
        $\{1:value}
      $\{2:body}
      """
      :-  '=~'
      """

      $\{1:body}
      """
      :-  '=*'
      """
        $\{1:alias}  $\{2:value}
      $\{3:body}
      """
      :-  '=,'
      """
        $\{1:alias}
      $\{3:body}
      """
  ::
      :-  '?|'
      """
        $\{1:condition}
      ==
      """
      :-  '?-'
      """
        $\{1:case}
        $\{2:type}  $\{3:value}
      ==
      """
      :-  '?:'
      """
        $\{1:if}
        $\{2:then}
      $\{3:else}
      """
      :-  '?.'
      """
        $\{1:if}
        $\{2:else}
      $\{3:then}
      """
      :-  '?^'
      """
        $\{1:value}
        $\{2:if-cell}
      $\{3:if-atom}
      """
      :-  '?<'
      """
        $\{1:assertion}
      $\{2:body}
      """
      :-  '?>'
      """
        $\{1:assertion}
      $\{2:body}
      """
      :-  '?+'
      """
        $\{1:case}  $\{2:else}
        $\{3:type}  $\{4:value}
      ==
      """
      :-  '?&'
      """
        $\{1:condition}
      ==
      """
      :-  '?@'
      """
        $\{1:value}
        $\{2:if-atom}
      $\{3:if-cell}
      """
      :-  '?~'
      """
        $\{1:value}
        $\{2:if-null}
      $\{3:if-nonnull}
      """
      :-  '?#'
      """
        $\{1:skin}
      $\{2:wing}
      """
      :-  '?='
      """
        $\{1:type}
      $\{2:wing}
      """
      :-  '?!'
      """
        $\{1:loobean}
      """
  ::
      :-  '!,'
      """
        *hoon
      $\{1:ast}
      """
      :-  '!>'
      """
        $\{1:value}
      """
      :-  '!;'
      """
        $\{1:type}
      $\{2:body}
      """
      :-  '!='
      """
        $\{1:body}
      """
      :-  '!@'
      """
        $\{1:wing}
        $\{2:if-exists}
      $\{3:if-not-exists}
      """
      :-  '!?'
      """
        $\{1:version}
      $\{2:body}
      """
      :-  '!!'
      ""
  ==
--
|=  rune=tape
^-  (list completion-item:lsp-sur)
=?  rune  =(' ' (snag 0 rune))
  (slag 1 rune)
~&  rune
%+  turn  (search-prefix:auto (crip rune) runes)
|=  [name=cord snippet=tape]
^-  completion-item:lsp-sur
[name 1 '' '' (crip snippet) 2]