iterative/vscode-dvc

View on GitHub
extension/src/tree/index.ts

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
import {
  MarkdownString,
  ThemeIcon,
  TreeDataProvider,
  TreeItem,
  TreeItemCollapsibleState,
  TreeView,
  Uri,
  window
} from 'vscode'
import { getMarkdownString } from '../vscode/markdownString'
import { RegisteredCommands } from '../commands/external'
import { hasKey } from '../util/object'

export enum DecoratableTreeItemScheme {
  EXPERIMENTS = 'dvc.experiments',
  PLOTS = 'dvc.plots',
  TRACKED = 'dvc.tracked'
}

export const getDecoratableUri = (
  label: string,
  scheme: DecoratableTreeItemScheme
): Uri => Uri.from({ path: label, scheme })

export const getDecoratableTreeItem = (
  label: string,
  scheme: DecoratableTreeItemScheme,
  collapsibleState = TreeItemCollapsibleState.None
): TreeItem => {
  const decoratableUri = getDecoratableUri(label, scheme)
  return new TreeItem(decoratableUri, collapsibleState)
}

export type ErrorItem = { error: string }

export const isErrorItem = (
  maybeErrorItem: unknown
): maybeErrorItem is ErrorItem => hasKey(maybeErrorItem, 'error')

export const getErrorTooltip = (msg: string): MarkdownString =>
  getMarkdownString(`$(error) ${msg}`)

export const getCliErrorLabel = (msg: string): string =>
  msg.split('\n')[0].replace(/'|"/g, '')

export const getCliErrorTreeItem = (
  label: string,
  msg: string,
  decoratableTreeItemScheme: DecoratableTreeItemScheme
) => {
  const treeItem = getDecoratableTreeItem(label, decoratableTreeItemScheme)

  treeItem.tooltip = getErrorTooltip(msg)

  treeItem.iconPath = new ThemeIcon('blank')

  treeItem.contextValue = 'cliError'

  treeItem.command = {
    command: RegisteredCommands.EXTENSION_SHOW_OUTPUT,
    title: 'Show DVC Output'
  }

  return treeItem
}

export const getCliErrorMessageTreeItem = (
  label: string,
  msg: string,
  decoratableTreeItemScheme: DecoratableTreeItemScheme
) => {
  const treeItem = getCliErrorTreeItem(label, msg, decoratableTreeItemScheme)

  treeItem.label = label

  return treeItem
}

export const isRoot = (element: unknown): element is string =>
  typeof element === 'string'

export const createTreeView = <T>(
  name: string,
  treeDataProvider: TreeDataProvider<string | T>,
  canSelectMany = false
): TreeView<string | T> =>
  window.createTreeView<string | T>(name, {
    canSelectMany,
    showCollapseAll: true,
    treeDataProvider
  })

export const getRootItem = (path: string): TreeItem => {
  const item = new TreeItem(Uri.file(path), TreeItemCollapsibleState.Expanded)
  item.id = path
  item.contextValue = 'dvcRoot'
  return item
}