« get me outta code hell

withPropertyFromAttachedArtwork.js « artwork « things « composite « data « src - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/data/composite/things/artwork/withPropertyFromAttachedArtwork.js
blob: a2f954b9b82086db81f1d3761a684da629e3a10f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import {input, templateCompositeFrom} from '#composite';

import {withResultOfAvailabilityCheck} from '#composite/control-flow';
import {withPropertyFromObject} from '#composite/data';

import withAttachedArtwork from './withAttachedArtwork.js';

function getOutputName({
  [input.staticValue('property')]: property,
}) {
  if (property) {
    return `#attachedArtwork.${property}`;
  } else {
    return '#value';
  }
}

export default templateCompositeFrom({
  annotation: `withPropertyFromAttachedArtwork`,

  inputs: {
    property: input({type: 'string'}),
  },

  outputs: inputs => [getOutputName(inputs)],

  steps: () => [
    {
      dependencies: [input.staticValue('property')],
      compute: (continuation, inputs) =>
        continuation({'#output': getOutputName(inputs)}),
    },

    withAttachedArtwork(),

    withResultOfAvailabilityCheck({
      from: '#attachedArtwork',
    }),

    {
      dependencies: ['#availability', '#output'],
      compute: (continuation, {
        ['#availability']: availability,
        ['#output']: output,
      }) =>
        (availability
          ? continuation()
          : continuation.raiseOutput({[output]: null})),
    },

    withPropertyFromObject({
      object: '#attachedArtwork',
      property: input('property'),
    }),

    {
      dependencies: ['#value', '#output'],
      compute: (continuation, {
        ['#value']: value,
        ['#output']: output,
      }) =>
        continuation.raiseOutput({[output]: value}),
    },
  ],
});