ClassSpecTweenBuilder function

Class ClassSpecTweenBuilder(
  1. SpecDefinitionContext context
)

Implementation

Class ClassSpecTweenBuilder(SpecDefinitionContext context) {
  final specClassName = context.options.specClassName;

  return Class((builder) {
    builder.docs.addAll([
      '/// A tween that interpolates between two [$specClassName] instances.',
      '///',
      '/// This class can be used in animations to smoothly transition between',
      '/// different [$specClassName] specifications.',
    ]);
    builder.name = '${specClassName}Tween';
    builder.extend = refer('Tween<$specClassName?>');

    final constructorParams = [
      Parameter((b) {
        b.name = 'super.begin';
        b.named = true;
      }),
      Parameter((b) {
        b.name = 'super.end';
        b.named = true;
      }),
    ];

    // Constructor
    builder.constructors.add(
      Constructor((builder) {
        builder.optionalParameters.addAll(constructorParams);
      }),
    );

    // lerp method
    builder.methods.add(Method((b) {
      b.name = 'lerp';
      b.annotations.add(refer('override'));
      b.returns = refer(specClassName);
      b.requiredParameters.add(Parameter((b) {
        b.name = 't';
        b.type = refer('double');
      }));
      b.body = Code('''
              if (begin == null && end == null) return const $specClassName();
              if (begin == null) return end!;

              return begin!.lerp(end!, t);
            ''');
    }));
  });
}