108eed45cSTomasz Sapeta // Copyright 2022-present 650 Industries. All rights reserved. 208eed45cSTomasz Sapeta 308eed45cSTomasz Sapeta /** 408eed45cSTomasz Sapeta A type that can decorate a `JavaScriptObject` with some properties. 508eed45cSTomasz Sapeta */ 69b8bcdc4STomasz Sapeta internal protocol JavaScriptObjectDecorator { 708eed45cSTomasz Sapeta /** 808eed45cSTomasz Sapeta Decorates an existing `JavaScriptObject`. 908eed45cSTomasz Sapeta */ decoratenull10*553b6180STomasz Sapeta func decorate(object: JavaScriptObject, appContext: AppContext) throws 1108eed45cSTomasz Sapeta } 1208eed45cSTomasz Sapeta 1308eed45cSTomasz Sapeta /** 1408eed45cSTomasz Sapeta A type that can build and decorate a `JavaScriptObject` based on its attributes. 1508eed45cSTomasz Sapeta */ 169b8bcdc4STomasz Sapeta internal protocol JavaScriptObjectBuilder: JavaScriptObjectDecorator { 1708eed45cSTomasz Sapeta /** 18*553b6180STomasz Sapeta Creates a decorated `JavaScriptObject` in the given app context. 1908eed45cSTomasz Sapeta */ 20*553b6180STomasz Sapeta func build(appContext: AppContext) throws -> JavaScriptObject 2108eed45cSTomasz Sapeta } 2208eed45cSTomasz Sapeta 2308eed45cSTomasz Sapeta /** 2408eed45cSTomasz Sapeta Provides the default behavior of `JavaScriptObjectBuilder`. 25*553b6180STomasz Sapeta The `build(appContext:)` creates a plain object and uses `decorate(object:appContext:)` for decoration. 2608eed45cSTomasz Sapeta */ 2708eed45cSTomasz Sapeta extension JavaScriptObjectBuilder { buildnull28*553b6180STomasz Sapeta func build(appContext: AppContext) throws -> JavaScriptObject { 29*553b6180STomasz Sapeta let object = try appContext.runtime.createObject() 30*553b6180STomasz Sapeta try decorate(object: object, appContext: appContext) 3108eed45cSTomasz Sapeta return object 3208eed45cSTomasz Sapeta } 3308eed45cSTomasz Sapeta decoratenull34*553b6180STomasz Sapeta func decorate(object: JavaScriptObject, appContext: AppContext) throws { 3508eed45cSTomasz Sapeta // no-op by default 3608eed45cSTomasz Sapeta } 3708eed45cSTomasz Sapeta } 38