Skip to content

Commit

Permalink
wip: cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
Julusian committed Feb 23, 2025
1 parent dcf4c5e commit 4b5a677
Show file tree
Hide file tree
Showing 8 changed files with 61 additions and 96 deletions.
8 changes: 6 additions & 2 deletions companion/lib/Graphics/Preview.ts
Original file line number Diff line number Diff line change
Expand Up @@ -117,8 +117,10 @@ export class GraphicsPreview {

if (this.#buttonReferencePreviews.get(fullId)) throw new Error('Session id is already in use')

const parser = this.#variablesController.createVariablesAndExpressionParser(location, null, null)

// Do a resolve of the reference for the starting image
const result = ParseInternalControlReference(this.#logger, this.#variablesController, location, options, true)
const result = ParseInternalControlReference(this.#logger, parser, location, options, true)

// Track the subscription, to allow it to be invalidated
this.#buttonReferencePreviews.set(fullId, {
Expand Down Expand Up @@ -175,6 +177,8 @@ export class GraphicsPreview {
for (const previewSession of this.#buttonReferencePreviews.values()) {
if (!previewSession.referencedVariableIds || !previewSession.referencedVariableIds.length) continue

const parser = this.#variablesController.createVariablesAndExpressionParser(previewSession.location, null, null)

const matchingChangedVariable = previewSession.referencedVariableIds.some((variable) =>
allChangedSet.has(variable)
)
Expand All @@ -183,7 +187,7 @@ export class GraphicsPreview {
// Resolve the new location
const result = ParseInternalControlReference(
this.#logger,
this.#variablesController,
parser,
previewSession.location,
previewSession.options,
true
Expand Down
3 changes: 2 additions & 1 deletion companion/lib/ImportExport/Controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,8 @@ export class ImportExportController {
const generateFilename = (filename: string, exportType: string, fileExt: string): string => {
//If the user isn't using their default file name, don't append any extra info in file name since it was a manual choice
const useDefault = filename == this.#userConfigController.getKey('default_export_filename')
const parsedName = this.#variablesController.values.parseVariables(filename, null).text
const parser = this.#variablesController.values.createVariablesAndExpressionParser(null, null, null)
const parsedName = parser.parseVariables(filename).text

return parsedName && parsedName !== 'undefined'
? `${parsedName}${exportType && useDefault ? '_' + exportType : ''}.${fileExt}`
Expand Down
4 changes: 2 additions & 2 deletions companion/lib/Instance/Definitions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -167,8 +167,8 @@ export class InstanceDefinitions {
}

if (style.text) {
const parser = this.#variablesValuesController.createVariablesAndExpressionParser(null, null, null)
if (style.textExpression) {
const parser = this.#variablesValuesController.createVariablesAndExpressionParser(null, null, null)
const parseResult = parser.executeExpression(style.text, undefined)
if (parseResult.ok) {
style.text = parseResult.value + ''
Expand All @@ -177,7 +177,7 @@ export class InstanceDefinitions {
style.text = 'ERR'
}
} else {
const parseResult = this.#variablesValuesController.parseVariables(style.text, null)
const parseResult = parser.parseVariables(style.text)
style.text = parseResult.text
}
}
Expand Down
4 changes: 3 additions & 1 deletion companion/lib/Instance/Wrapper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -805,7 +805,9 @@ export class SocketEventsHandler {
): Promise<ParseVariablesInStringResponseMessage> {
try {
const location = msg.controlId ? this.#deps.page.getLocationOfControlId(msg.controlId) : null
const result = this.#deps.variables.values.parseVariables(msg.text, location)

const parser = this.#deps.variables.values.createVariablesAndExpressionParser(location, null, null)
const result = parser.parseVariables(msg.text)

return {
text: result.text,
Expand Down
66 changes: 40 additions & 26 deletions companion/lib/Internal/Controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ import type {
InternalVisitor,
} from './Types.js'
import type { RunActionExtras } from '../Instance/Wrapper.js'
import type { CompanionVariableValue } from '@companion-module/base'
import type { CompanionVariableValue, CompanionVariableValues } from '@companion-module/base'
import type { ControlsController, NewFeedbackValue } from '../Controls/Controller.js'
import type { ExecuteExpressionResult, VariablesCache } from '../Variables/Util.js'
import type { ExecuteExpressionResult } from '../Variables/Util.js'
import type { ParseVariablesResult } from '../Variables/Util.js'
import type { ControlLocation } from '@companion-app/shared/Model/Common.js'
import type { VariablesController } from '../Variables/Controller.js'
Expand Down Expand Up @@ -563,15 +563,23 @@ export class InternalController {
*/
parseVariablesForInternalActionOrFeedback(
str: string,
extras: RunActionExtras | FeedbackEntityModelExt,
injectedVariableValues?: VariablesCache
extras: RunActionExtras | FeedbackEntityModelExt
// injectedVariableValues?: VariablesCache
): ParseVariablesResult {
if (!this.#initialized) throw new Error(`InternalController is not initialized`)

if (!injectedVariableValues) injectedVariableValues = new Map()
if (!('id' in extras)) this.#addInjectedVariablesForLocation(injectedVariableValues, extras)
const injectedVariableValuesComplete = {
...('id' in extras ? {} : this.#getInjectedVariablesForLocation(extras)),
// ...injectedVariableValues,
}

const parser = this.#variablesController.values.createVariablesAndExpressionParser(
extras.location,
null,
injectedVariableValuesComplete
)

return this.#variablesController.values.parseVariables(str, extras?.location, injectedVariableValues)
return parser.parseVariables(str)
}

/**
Expand All @@ -585,20 +593,23 @@ export class InternalController {
executeExpressionForInternalActionOrFeedback(
str: string,
extras: RunActionExtras | FeedbackEntityModelExt,
requiredType?: string,
injectedVariableValues?: VariablesCache
requiredType?: string
// injectedVariableValues?: VariablesCache
): ExecuteExpressionResult {
if (!this.#initialized) throw new Error(`InternalController is not initialized`)

if (!injectedVariableValues) injectedVariableValues = new Map()
if (!('id' in extras)) this.#addInjectedVariablesForLocation(injectedVariableValues, extras)
const injectedVariableValuesComplete = {
...('id' in extras ? {} : this.#getInjectedVariablesForLocation(extras)),
// ...injectedVariableValues,
}

return this.#variablesController.values.executeExpression(
String(str),
const parser = this.#variablesController.values.createVariablesAndExpressionParser(
extras.location,
requiredType,
injectedVariableValues
null,
injectedVariableValuesComplete
)

return parser.executeExpression(String(str), requiredType)
}

/**
Expand All @@ -614,25 +625,28 @@ export class InternalController {
} {
if (!this.#initialized) throw new Error(`InternalController is not initialized`)

const injectedVariableValues: VariablesCache = new Map()
if (!('id' in extras)) this.#addInjectedVariablesForLocation(injectedVariableValues, extras)
const injectedVariableValuesComplete = {
...('id' in extras ? {} : this.#getInjectedVariablesForLocation(extras)),
// ...injectedVariableValues,
}

return ParseInternalControlReference(
this.#logger,
this.#variablesController.values,
const parser = this.#variablesController.values.createVariablesAndExpressionParser(
extras.location,
options,
useVariableFields,
injectedVariableValues
null,
injectedVariableValuesComplete
)

return ParseInternalControlReference(this.#logger, parser, extras.location, options, useVariableFields)
}

/**
* Variables to inject based on an internal action
*/
#addInjectedVariablesForLocation(values: VariablesCache, extras: RunActionExtras): void {
// Doesn't need to be reactive, it's only for an action
values.set('$(this:surface_id)', extras.surfaceId)
#getInjectedVariablesForLocation(extras: RunActionExtras): CompanionVariableValues {
return {
// Doesn't need to be reactive, it's only for an action
'$(this:surface_id)': extras.surfaceId,
}
}

/**
Expand Down
17 changes: 5 additions & 12 deletions companion/lib/Internal/Util.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,17 @@
import { oldBankIndexToXY } from '@companion-app/shared/ControlId.js'
import type { ControlLocation } from '@companion-app/shared/Model/Common.js'
import type { Logger } from '../Log/Controller.js'
import type { VariablesValues } from '../Variables/Values.js'
import type { VariablesCache } from '../Variables/Util.js'
import type { VariablesAndExpressionParser } from '../Variables/Util.js'

/**
*
*/
export function ParseInternalControlReference(
logger: Logger,
variablesController: VariablesValues,
parser: VariablesAndExpressionParser,
pressLocation: ControlLocation | undefined,
options: Record<string, any>,
useVariableFields: boolean,
injectedVariableValues?: VariablesCache
useVariableFields: boolean
): {
location: ControlLocation | null
referencedVariables: Set<string>
Expand Down Expand Up @@ -93,7 +91,7 @@ export function ParseInternalControlReference(
break
case 'text':
if (useVariableFields) {
const result = variablesController.parseVariables(options.location_text, pressLocation, injectedVariableValues)
const result = parser.parseVariables(options.location_text)

location = parseLocationString(result.text)
referencedVariables = result.variableIds
Expand All @@ -103,12 +101,7 @@ export function ParseInternalControlReference(
break
case 'expression':
if (useVariableFields) {
const result = variablesController.executeExpression(
options.location_expression,
pressLocation,
'string',
injectedVariableValues
)
const result = parser.executeExpression(options.location_expression, 'string')
if (result.ok) {
location = parseLocationString(String(result.value))
} else {
Expand Down
3 changes: 2 additions & 1 deletion companion/lib/Internal/Variables.ts
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,8 @@ export class InternalVariables implements InternalModuleFragment {

return compareValues(feedback.options.op, result1.text, result2.text)
} else if (feedback.definitionId == 'check_expression') {
const res = this.#variableController.executeExpression(feedback.options.expression, feedback.location, 'boolean')
const parser = this.#variableController.createVariablesAndExpressionParser(feedback.location, null, null)
const res = parser.executeExpression(feedback.options.expression, 'boolean')

this.#variableSubscriptions.set(feedback.id, res.variableIds)

Expand Down
52 changes: 1 addition & 51 deletions companion/lib/Variables/Values.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,7 @@

import LogController from '../Log/Controller.js'
import EventEmitter from 'events'
import {
ExecuteExpressionResult,
ParseVariablesResult,
VARIABLE_UNKNOWN_VALUE,
VariableValueData,
VariablesCache,
VariablesAndExpressionParser,
parseVariablesInString,
executeExpression,
} from './Util.js'
import { VARIABLE_UNKNOWN_VALUE, VariableValueData, VariablesCache, VariablesAndExpressionParser } from './Util.js'
import type { ControlLocation } from '@companion-app/shared/Model/Common.js'
import type { CompanionVariableValue, CompanionVariableValues } from '@companion-module/base'
import type { ClientSocket } from '../UI/Handler.js'
Expand Down Expand Up @@ -54,47 +45,6 @@ export class VariablesValues extends EventEmitter<VariablesValuesEvents> {
return this.getVariableValue('custom', name)
}

/**
* Parse the variables in a string
* @param str - String to parse variables in
* @param controlLocation - Location of the control
* @param injectedVariableValues - Inject some variable values
* @returns with variables replaced with values
*/
parseVariables(
str: string,
controlLocation: ControlLocation | null | undefined,
injectedVariableValues?: VariablesCache
): ParseVariablesResult {
// TODO-localvariables avoid this mutation
injectedVariableValues = injectedVariableValues || new Map()
this.addInjectedVariablesForLocation(injectedVariableValues, controlLocation)

return parseVariablesInString(str, this.#variableValues, injectedVariableValues)
}

/**
* @deprecated
* Parse and execute an expression in a string
* @param str - String containing the expression to parse
* @param controlLocation - Location of the control
* @param requiredType - Fail if the result is not of specified type
* @param injectedVariableValues - Inject some variable values
* @returns result of the expression
*/
executeExpression(
str: string,
controlLocation: ControlLocation | null | undefined,
requiredType?: string,
injectedVariableValues?: VariablesCache
): ExecuteExpressionResult {
// TODO-localvariables avoid this mutation
injectedVariableValues = injectedVariableValues || new Map()
this.addInjectedVariablesForLocation(injectedVariableValues, controlLocation)

return executeExpression(str, this.#variableValues, requiredType, injectedVariableValues)
}

createVariablesAndExpressionParser(
controlLocation: ControlLocation | null | undefined,
localValues: SomeEntityModel[] | null,
Expand Down

0 comments on commit 4b5a677

Please sign in to comment.