mapr 0.3.0 icon indicating copy to clipboard operation
mapr: ^0.3.0 copied to clipboard

A dart package inspired by AutoMapper which auto generates mapping classes and exposes a simple mapping api

Dart

Mapr #

This is a code gen / helper mapping package inspired by C#'s AutoMapper that makes it easier to map between objects by generating mapping methods that are exposed by a simple api. #


Features: #

  • Code generation of mapping classes
  • Auto mapping with field renaming and field recasing
  • A simple mapping api inspired by AutoMapper used by c# developers

Install #

https://pub.dev/packages/mapr

add to your pubspec.yaml #

dependencies:
    mapr: ^0.2.0

or run #

dart pub add mapr or flutter pub add mapr #


How to use #

1. Have objects you want to map #

class HouseAddress {
    final int houseNumber;
    final String streetName;

    const HouseAddress({
        required this.houseNumber,
        required this.streetName,
    });

    @override
    String toString() => '$houseNumber $streetName';
}

class BuildingAddress {
    final int BuildingNumber;
    final String StreetName;

    const BuildingAddress({
        required this.BuildingNumber,
        required this.StreetName,
    });

    @override
    String toString() => '$BuildingNumber $StreetName';
}

2. Setup mapper class #

Setup @MaprBase annotation and then run

@MaprBase(objectMaps: [
    ObjectMap<HouseAddress, BuildingAddress>(
        fieldRename: {
            "houseNumber": "BuildingNumber",
        },
        srcConvention: NameConvention.camelCase,
        dstConvention: NameConvention.PascalCase,
    )
])
class Mapper extends $Mapper {
    @override
    configure() {
        // no additional maps needed since all should be auto generated
    }
}

3. Run build_runner #

$ dart run build_runner build --delete-conflicting-outputs

4. Map objects! #

void main() {
    final mapper = Mapper();

    final houseAddress = HouseAddress(
        houseNumber: 124,
        streetName: 'Conch St.',
    );
    print(houseAddress); // -> 124 Conch St.

    final buildingAddress = mapper.map<HouseAddress, BuildingAddress>(houseAddress);
    print(buildingAddress); // -> 124 Conch St.

    final origional = mapper.map<BuildingAddress, HouseAddress>(buildingAddress);
    print(origional); // -> 124 Conch St.
}

Setup map overrides #

Sometimes fields do not map 1 to 1, in this case we can setup a map override for a single field or the entire class! #

Individual fields override #

class Person {
    String name;
    Address address; // Address(int houseNum, String streetName)
    const Person(this.name, this.address);
}

class DtoPerson {
    String Name;
    int HouseNumber;
    String StreetName;
    const DtoPerson(
        this.Name,
        this.HouseNumber,
        this.StreetName,
    );
}

@MaprBase(objectMaps: [
    ObjectMap<Person, DtoPerson>(
        srcConvention: NameConvention.camelCase,
        dstConvention: NameConvention.PascalCase,
    ),
])
class Mapper extends $Mapper {
    @override
    void configure() {
        setMap.so.Person.to.DtoPerson
            ..StreetName = ((source) => source.address.streetName)
            ..HouseNumber = ((source) => source.address.houseNum);

        setMap.so.PersonDto.to.Person.address
            = (source) => Address(source.HouseNumber, source.StreetName);

    }

}

Full override #

    @override
    void configure() {
        setMap.so.Person.to.DtoPerson.customMap = (source) {
            return Person(
                source.Name,
                Address(source.HouseNumber, source.StreetName),
            );
        };
    }
3
likes
120
pub points
0%
popularity

Publisher

unverified uploader

A dart package inspired by AutoMapper which auto generates mapping classes and exposes a simple mapping api

Repository (GitHub)

Documentation

API reference

License

Icon for licenses.BSD-3-Clause (LICENSE)

Dependencies

analyzer, build, recase, source_gen

More

Packages that depend on mapr