Skip to content

Commit

Permalink
refactor: use runner-data
Browse files Browse the repository at this point in the history
  • Loading branch information
seven332 committed Dec 16, 2023
1 parent 7c15223 commit 0e367b2
Show file tree
Hide file tree
Showing 9 changed files with 141 additions and 76 deletions.
52 changes: 8 additions & 44 deletions packages/extension/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
import * as path from 'path'
import * as vscode from 'vscode'
import { LanguageClient, TransportKind } from 'vscode-languageclient/node'
import * as fs from 'fs'
import { QueryResult, kQueryUrl } from '@workspace/runner-data'
import { Runner } from './runner'

let client: LanguageClient | undefined

export async function activate(context: vscode.ExtensionContext) {
context.subscriptions.push(vscode.commands.registerCommand('sksl.showRunner', (uri) => showRunner(context, uri)))

const module = context.asAbsolutePath(path.join('build', 'server.js'))
const skslWasmPath = context.asAbsolutePath(path.join('build', 'sksl-wasm.wasm'))
const transport = TransportKind.ipc
Expand All @@ -28,6 +25,13 @@ export async function activate(context: vscode.ExtensionContext) {
},
)
await client.start()

const runner = new Runner(context, client)
context.subscriptions.push(
vscode.commands.registerCommand(Runner.kCommand, (url) => {
runner.run(url)
}),
)
}

export async function deactivate() {
Expand All @@ -36,43 +40,3 @@ export async function deactivate() {
client = undefined
}
}

function showRunner(context: vscode.ExtensionContext, uri: vscode.Uri | undefined) {
const panel = vscode.window.createWebviewPanel('sksl.runner', 'SkSL Runner', vscode.ViewColumn.Beside, {
enableScripts: true,
})

const htmlPath = context.asAbsolutePath(path.join('build', 'runner-ui', 'index.html'))
panel.webview.html = fs.readFileSync(htmlPath).toString()

if (uri) {
selectSkSL(panel, uri)
}

panel.webview.onDidReceiveMessage(
async () => {
const uris = await vscode.window.showOpenDialog({
canSelectFiles: true,
canSelectFolders: false,
canSelectMany: false,
filters: {
SkSL: ['sksl'],
},
})
if (uris && uris.length >= 1) {
selectSkSL(panel, uris[0])
}
},
undefined,
context.subscriptions,
)
}

async function selectSkSL(panel: vscode.WebviewPanel, uri: vscode.Uri) {
panel.webview.postMessage(uri.toString())
const buffer = fs.readFileSync(uri.fsPath)
const result: QueryResult | undefined = await client?.sendRequest(kQueryUrl, {
source: buffer.toString(),
})
console.log(result)
}
65 changes: 65 additions & 0 deletions packages/extension/src/runner.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import * as vscode from 'vscode'
import { LanguageClient } from 'vscode-languageclient/node'
import * as path from 'path'
import * as fs from 'fs'
import { Message, QueryResult, kQueryUrl, MessageType, SelectSkSLResponseMessage, pipe } from '@workspace/runner-data'

export class Runner {
public static kCommand = 'sksl.showRunner'

public constructor(
private context: vscode.ExtensionContext,
private client: LanguageClient,
) {}

public run(uri: vscode.Uri | undefined) {
const panel = vscode.window.createWebviewPanel('sksl.runner', 'SkSL Runner', vscode.ViewColumn.Beside, {
enableScripts: true,
})

const htmlPath = this.context.asAbsolutePath(path.join('build', 'runner-ui', 'index.html'))
panel.webview.html = fs.readFileSync(htmlPath).toString()

if (uri) {
this.selectSkSL(panel, uri)
}

panel.webview.onDidReceiveMessage(
async (message: Message) => {
switch (message.type) {
case MessageType.kSelectSkSL: {
const uris = await vscode.window.showOpenDialog({
canSelectFiles: true,
canSelectFolders: false,
canSelectMany: false,
filters: {
SkSL: ['sksl'],
},
})
if (uris && uris.length >= 1) {
this.selectSkSL(panel, uris[0])
}
break
}
}
},
undefined,
this.context.subscriptions,
)
}

private async selectSkSL(panel: vscode.WebviewPanel, uri: vscode.Uri) {
panel.webview.postMessage(
pipe<SelectSkSLResponseMessage>({
type: MessageType.kSelectSkSL,
path: uri.toString(),
}),
)

const buffer = fs.readFileSync(uri.fsPath)
const result: QueryResult = await this.client.sendRequest(kQueryUrl, {
source: buffer.toString(),
})
console.log(result)
}
}
30 changes: 3 additions & 27 deletions packages/runner-data/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,27 +1,3 @@
export const kQueryUrl = 'sksl/query'

export interface QueryParams {
source: string
}

export interface SkSLUniform {
type: string
name: string
}

export const dummySkSLUniform: SkSLUniform = {
type: '',
name: '',
}

export interface QueryResult {
succeed: boolean
kind: string
uniforms: SkSLUniform[]
}

export const dummyQueryResult: QueryResult = {
succeed: false,
kind: '',
uniforms: [dummySkSLUniform],
}
export * from './message'
export * from './url'
export * from './wasm'
21 changes: 21 additions & 0 deletions packages/runner-data/src/message.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
export enum MessageType {
kSelectSkSL,
kGetUniforms,
}

export interface Message {
type: MessageType
}

export interface SelectSkSLRequestMessage extends Message {
type: MessageType.kSelectSkSL
}

export interface SelectSkSLResponseMessage extends Message {
type: MessageType.kSelectSkSL
path: string
}

export function pipe<T>(t: T): T {
return t
}
1 change: 1 addition & 0 deletions packages/runner-data/src/url.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const kQueryUrl = 'sksl/query'
25 changes: 25 additions & 0 deletions packages/runner-data/src/wasm.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
export interface QueryParams {
source: string
}

export interface SkSLUniform {
type: string
name: string
}

export const dummySkSLUniform: SkSLUniform = {
type: '',
name: '',
}

export interface QueryResult {
succeed: boolean
kind: string
uniforms: SkSLUniform[]
}

export const dummyQueryResult: QueryResult = {
succeed: false,
kind: '',
uniforms: [dummySkSLUniform],
}
1 change: 1 addition & 0 deletions packages/runner-ui/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
"vue": "^3.3.4"
},
"devDependencies": {
"@workspace/runner-data": "workspace:*",
"@tsconfig/node18": "^18.2.2",
"@types/node": "^18.18.5",
"@vitejs/plugin-vue": "^4.4.0",
Expand Down
19 changes: 14 additions & 5 deletions packages/runner-ui/src/App.vue
Original file line number Diff line number Diff line change
@@ -1,20 +1,29 @@
<script setup lang="ts">
import { ref } from 'vue'
import './vscode-webview'
import {
type Message,
MessageType,
pipe,
type SelectSkSLRequestMessage,
type SelectSkSLResponseMessage,
} from '@workspace/runner-data'
let skslPath = ref('')
// TODO: message type
window.addEventListener('message', (event) => {
const message = event.data
skslPath.value = message
const message = event.data as Message
switch (message.type) {
case MessageType.kSelectSkSL:
skslPath.value = (message as SelectSkSLResponseMessage).path
break
}
})
const vscode = acquireVsCodeApi()
function selectSkSL() {
vscode.postMessage('Select SkSL')
vscode.postMessage(pipe<SelectSkSLRequestMessage>({ type: MessageType.kSelectSkSL }))
}
</script>

Expand Down
3 changes: 3 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 0e367b2

Please sign in to comment.