Skip to content

Commit

Permalink
add ExtractionFacade.supports to try and improve on language composition
Browse files Browse the repository at this point in the history
  • Loading branch information
dslmeinte committed Oct 14, 2023
1 parent fd6dc3f commit 0ee2f41
Show file tree
Hide file tree
Showing 7 changed files with 32 additions and 8 deletions.
3 changes: 3 additions & 0 deletions packages/core/src/dynamic-facade.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ export type DynamicNode = Node & {
* An implementation of {@link ExtractionFacade} for {@link DynamicNode dynamic nodes}.
*/
export const dynamicExtractionFacade: ExtractionFacade<DynamicNode> = ({
supports: (node) =>
"classifier" in node && node.classifier instanceof Classifier
&& "settings" in node && typeof node.settings === "object" && !Array.isArray(node.settings),
classifierOf: (node) => node.classifier,
getFeatureValue: (node, feature) =>
// eslint-disable-next-line @typescript-eslint/no-explicit-any
Expand Down
5 changes: 5 additions & 0 deletions packages/core/src/facade.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@ type ClassifierDeducer<NT extends Node> = (node: NT) => Classifier

interface ExtractionFacade<NT extends Node> {

/**
* @return Whether the given {@link Node node} belongs to any of the languages supported by this {@link ReadModelAPI API}.
*/
supports: (node: Node) => boolean

/**
* @return The {@link Concept concept} of the given node
*/
Expand Down
2 changes: 2 additions & 0 deletions packages/core/src/m3/facade.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
Interface,
Language,
M3Concept,
M3Node,
PrimitiveType,
Property,
Reference
Expand All @@ -22,6 +23,7 @@ const {inamed_name} = builtinFeatures


export const lioncoreExtractionFacade: ExtractionFacade<M3Concept> = ({
supports: (node) => node instanceof M3Node,
classifierOf: classBasedClassifierDeducerFor(lioncore),
getFeatureValue: (node, feature) =>
// eslint-disable-next-line @typescript-eslint/no-explicit-any
Expand Down
4 changes: 2 additions & 2 deletions packages/core/src/m3/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,7 @@ export {
PrimitiveType,
Property,
Reference,
M3Node,
isINamed,
isIKeyed,
lioncoreBuiltinsQName,
Expand All @@ -277,7 +278,6 @@ export {
export type {
IKeyed,
INamed,
M3Concept,
M3Node
M3Concept
}

4 changes: 4 additions & 0 deletions packages/core/src/serializer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ export const serializeNodes = <NT extends Node>(nodes: NT[], extractionFacade: E
return
}

if (!extractionFacade.supports(node)) {
throw new Error(`node with id "${node.id}" belongs to a language that's not supported by the ReadModelAPI`)
}

const classifier = extractionFacade.classifierOf(node)
const language = classifier.language
registerLanguageUsed(language)
Expand Down
10 changes: 9 additions & 1 deletion packages/test/src/instances/library.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ import {
Id,
InstantiationFacade,
nameBasedClassifierDeducerFor,
updateSettingsNameBased
Node,
updateSettingsNameBased,
} from "@lionweb/core"
import {hashingIdGen} from "@lionweb/utilities"
import {libraryLanguage} from "../languages/library.js"
Expand All @@ -25,6 +26,12 @@ export type BaseNode = {
classifier: string
}


export const isBaseNodeOfAnyOfTypes = (...types: string[]) =>
(node: Node) =>
"classifier" in node && typeof node.classifier === "string" && types.includes(node.classifier)


export type Book = BaseNode & {
classifier: "Book"
title: string
Expand Down Expand Up @@ -55,6 +62,7 @@ export type SpecialistBookWriter = Writer & BaseNode & {


export const libraryExtractionFacade: ExtractionFacade<BaseNode> = {
supports: isBaseNodeOfAnyOfTypes("Book", "Library", "GuideBookWriter", "SpecialistBook"),
classifierOf: (node) => nameBasedClassifierDeducerFor(libraryLanguage)(node.classifier),
getFeatureValue: (node, feature) =>
// eslint-disable-next-line @typescript-eslint/no-explicit-any
Expand Down
12 changes: 7 additions & 5 deletions packages/test/src/instances/multi.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import {hashingIdGen} from "@lionweb/utilities"
import {ExtractionFacade, nameBasedClassifierDeducerFor, Node} from "@lionweb/core"
import {multiLanguage} from "../languages/multi.js"
import {BaseNode, bobLibrary, jackLondon, Library, libraryExtractionFacade} from "./library.js"
import {libraryLanguage} from "../languages/library.js"
import {multiLanguage} from "../languages/multi.js"
import {BaseNode, bobLibrary, isBaseNodeOfAnyOfTypes, jackLondon, Library, libraryExtractionFacade} from "./library.js"


export type Container = Node & {
Expand All @@ -13,10 +13,12 @@ export type Container = Node & {

export const multiExtractionFacade: ExtractionFacade<BaseNode> = {
...libraryExtractionFacade,
/* override */ supports: (node) =>
libraryExtractionFacade.supports(node) || isBaseNodeOfAnyOfTypes("Container")(node),
/* override */ classifierOf: (node) =>
nameBasedClassifierDeducerFor(libraryLanguage)(node.classifier)
??
nameBasedClassifierDeducerFor(multiLanguage)(node.classifier),
libraryExtractionFacade.supports(node)
? nameBasedClassifierDeducerFor(libraryLanguage)(node.classifier)
: nameBasedClassifierDeducerFor(multiLanguage)(node.classifier),
}


Expand Down

0 comments on commit 0ee2f41

Please sign in to comment.