smartstruct 1.0.1 copy "smartstruct: ^1.0.1" to clipboard
smartstruct: ^1.0.1 copied to clipboard

outdated

A dart bean mapper annotation processor

Smartstruct - Dart bean mappings - the easy nullsafe way! #

Code generator for generating type-safe mappers, inspired by https://mapstruct.org/

Installation #

Add smartstruct as a dev dependency.

dev_dependencies:
  smartstruct:

Run the generator

dart run build_runner build
flutter packages pub run build_runner build
// or watch
flutter packages pub run build_runner watch

Setup #

Create your beans.

class Dog {
    final String breed;
    final int age;
    final String name;
    Dog(this.breed, this.age, this.name);
}
class DogModel {
    final String breed;
    final int age;
    final String name;
    Dog(this.breed, this.age, this.name);
}

To generate a mapper for these two beans, you need to create a mapper interface.

// dog.mapper.dart
@Mapper()
abstract class DogMapper {
    Dog fromModel(DogModel model);
}

Once you ran the generator, next to your dog.mapper.dart a dog.mapper.g.dart will be generated.

dart run build_runner build
// dog.mapper.g.dart
class DogMapperImpl extends DogMapper {
    Dog fromModel(DogModel model) {
        Dog dog = Dog(model.breed, model.age, model.name);
        return dog;
    }
}

The Mapper supports positional arguments, named arguments and property access via implicit and explicit setters.

Explicit Field Mapping #

If some fields do not match each other, you can add a Mapping Annotation on the method level, to change the behaviour of certain mappings.

class Dog {
    final String name;
}
class DogModel {
    final String dogName;
}
@Mapper()
class DogMapper {
    @Mapping(source: 'dogName', target: 'name')
    Dog fromModel(DogModel model);
}

In this case, the field dogName of DogModel will be mapped to the field name of the resulting Dog

Injectable #

The Mapper can be made a lazy injectable singleton, by setting the argument useInjection to true, in the Mapper Interface. In this case you also need to add the injectable dependency, as described here. https://pub.dev/packages/injectable

@Mapper(useInjectable = true)
abstract class DogMapper {
    Dog fromModel(DogModel model);
}
@LazySingleton(as: DogMapper)
class DogMapperImpl extends DogMapper {...}

Example #

Please refer to the example package, for a list of examples and how to use the Mapper Annotation.

You can always run the examples by navigating to the examples package and executing the generator.

$ dart pub get
...
$ dart run build_runner build
48
likes
0
pub points
79%
popularity

Publisher

unverified uploader

A dart bean mapper annotation processor

Repository (GitHub)
View/report issues

License

unknown (license)

Dependencies

analyzer, build, code_builder, source_gen

More

Packages that depend on smartstruct