Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion vscode/extension/src/commands/format.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,18 @@ export const format =
(
authProvider: AuthenticationProviderTobikoCloud,
lsp: LSPClient | undefined,
restartLSP: () => Promise<void>,
) =>
async (): Promise<void> => {
traceLog('Calling format')
const out = await internalFormat(lsp)
if (isErr(out)) {
return handleError(authProvider, out.error, 'Project format failed')
return handleError(
authProvider,
restartLSP,
out.error,
'Project format failed',
)
}
vscode.window.showInformationMessage('Project formatted successfully')
}
Expand Down
21 changes: 19 additions & 2 deletions vscode/extension/src/commands/signin.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,30 @@
import { AuthenticationProviderTobikoCloud } from '../auth/auth'
import * as vscode from 'vscode'
import { isCodespaces } from '../utilities/isCodespaces'
import { traceInfo } from '../utilities/common/log'

export const signIn =
(authenticationProvider: AuthenticationProviderTobikoCloud) => async () => {
(
authenticationProvider: AuthenticationProviderTobikoCloud,
onSignInSuccess: () => Promise<void>,
) =>
async () => {
if (isCodespaces()) {
await authenticationProvider.sign_in_device_flow()
} else {
await authenticationProvider.createSession()
}
await vscode.window.showInformationMessage('Signed in successfully')

// Do not await this, as this will block the thread, you just need to show the message, but not block
vscode.window.showInformationMessage('Signed in successfully')

// Execute callback after successful sign-in
if (onSignInSuccess) {
traceInfo('Executing post sign-in callback')
try {
await onSignInSuccess()
} catch (error) {
traceInfo(`Error in post sign-in callback: ${error}`)
}
}
}
26 changes: 25 additions & 1 deletion vscode/extension/src/commands/signinSpecifyFlow.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@ import { traceInfo } from '../utilities/common/log'
import { window } from 'vscode'

export const signInSpecifyFlow =
(authenticationProvider: AuthenticationProviderTobikoCloud) => async () => {
(
authenticationProvider: AuthenticationProviderTobikoCloud,
onSignInSuccess?: () => Promise<void>,
) =>
async () => {
traceInfo('Sign in specify flow')
const flowOptions = [
{
Expand All @@ -24,11 +28,31 @@ export const signInSpecifyFlow =
await authenticationProvider.sign_in_oauth_flow()
await authenticationProvider.getSessions()
await window.showInformationMessage('Sign in success')

// Execute callback after successful sign-in
if (onSignInSuccess) {
traceInfo('Executing post sign-in callback')
try {
await onSignInSuccess()
} catch (error) {
traceInfo(`Error in post sign-in callback: ${error}`)
}
}
return
} else if (selectedFlow.label === 'Device Flow') {
await authenticationProvider.sign_in_device_flow()
await authenticationProvider.getSessions()
await window.showInformationMessage('Sign in success')

// Execute callback after successful sign-in
if (onSignInSuccess) {
traceInfo('Executing post sign-in callback')
try {
await onSignInSuccess()
} catch (error) {
traceInfo(`Error in post sign-in callback: ${error}`)
}
}
return
} else {
traceInfo('Invalid flow selected')
Expand Down
48 changes: 38 additions & 10 deletions vscode/extension/src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,21 @@ export async function activate(context: vscode.ExtensionContext) {
traceInfo('Authentication provider registered')

context.subscriptions.push(
vscode.commands.registerCommand('sqlmesh.signin', signIn(authProvider)),
vscode.commands.registerCommand(
'sqlmesh.signin',
signIn(authProvider, async () => {
traceInfo('Restarting LSP after sign-in')
await restart()
}),
),
)
context.subscriptions.push(
vscode.commands.registerCommand(
'sqlmesh.signinSpecifyFlow',
signInSpecifyFlow(authProvider),
signInSpecifyFlow(authProvider, async () => {
traceInfo('Restarting LSP after sign-in')
await restart()
}),
),
)
context.subscriptions.push(
Expand All @@ -76,13 +85,6 @@ export async function activate(context: vscode.ExtensionContext) {
),
)

context.subscriptions.push(
vscode.commands.registerCommand(
'sqlmesh.format',
format(authProvider, lspClient),
),
)

// Register the webview
const lineagePanel = new LineagePanel(context.extensionUri, lspClient)
context.subscriptions.push(
Expand Down Expand Up @@ -118,14 +120,35 @@ export async function activate(context: vscode.ExtensionContext) {
if (isErr(restartResult)) {
return handleError(
authProvider,
restart,
restartResult.error,
'LSP restart failed',
)
}
context.subscriptions.push(lspClient)
} else {
lspClient = new LSPClient()
const result = await lspClient.start()
if (isErr(result)) {
return handleError(
authProvider,
restart,
result.error,
'Failed to start LSP',
)
} else {
context.subscriptions.push(lspClient)
}
}
}

context.subscriptions.push(
vscode.commands.registerCommand(
'sqlmesh.format',
format(authProvider, lspClient, restart),
),
)

context.subscriptions.push(
onDidChangePythonInterpreter(async () => {
await restart()
Expand All @@ -140,7 +163,12 @@ export async function activate(context: vscode.ExtensionContext) {

const result = await lspClient.start()
if (isErr(result)) {
return handleError(authProvider, result.error, 'Failed to start LSP')
return handleError(
authProvider,
restart,
result.error,
'Failed to start LSP',
)
} else {
context.subscriptions.push(lspClient)
}
Expand Down
6 changes: 4 additions & 2 deletions vscode/extension/src/utilities/errors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ interface SqlmeshLspDependenciesMissingError {

export async function handleError(
authProvider: AuthenticationProviderTobikoCloud,
restartLsp: () => Promise<void>,
error: ErrorType,
genericErrorPrefix?: string,
): Promise<void> {
Expand All @@ -85,7 +86,7 @@ export async function handleError(
)
return
case 'not_signed_in':
return handleNotSignedInError(authProvider)
return handleNotSignedInError(authProvider, restartLsp)
case 'sqlmesh_not_found':
return handleSqlmeshNotFoundError()
case 'sqlmesh_lsp_not_found':
Expand All @@ -110,14 +111,15 @@ export async function handleError(
*/
const handleNotSignedInError = async (
authProvider: AuthenticationProviderTobikoCloud,
restartLsp: () => Promise<void>,
): Promise<void> => {
traceInfo('handleNotSginedInError')
const result = await window.showInformationMessage(
'Please sign in to Tobiko Cloud to use SQLMesh',
'Sign In',
)
if (result === 'Sign In') {
await signIn(authProvider)()
await signIn(authProvider, restartLsp)()
}
}

Expand Down
Loading