Haxe Code Cookbook
Haxe programming cookbookMacrosAdd a map

Add a map

Reading time: 1.5 minute

This snippet demonstrates how to add a map field to a type.

We can use expression reification to turn basic types into appropriate expressions. Maps, however, are a complex type. As such they need to be treated a little differently.

A map is a container of key-value pairs that can be observed as an array of key => value expressions. For example: var m = [ 1 => "ONE", 2 => "TWO"]. With that in mind, building a map field is no different than creating an array of the correct expressions.

Note the use of macro to create the key => value expression. Also note the use of expression reification: $v{} to generate expressions from specified values, and $a{} to create the expression array.

Build macro

 import haxe.macro.Context; import haxe.macro.Expr; class MapBuilder {  public static macro function build(names : Array<String>) : Array<Field> {  // The context is the class this build macro is called on  var fields = Context.getBuildFields();  // A map is an array of `key => value` expressions  var map : Array<Expr> = [];  // We add a `key => value` expression for every name  for (name in names) {  // Expression reification generates expression from argument  map.push(macro $v{name} => $v{haxe.crypto.Sha256.encode(name)});  }  // We push the map into the context build fields  fields.push({  // The line position that will be referenced on error  pos: Context.currentPos(),  // Field name  name: "namesHashed",  // Attached metadata (we are not adding any)  meta: null,  // Field type is Map<String, String>, `map` is the map  kind: FieldType.FVar(macro : Map<String, String>, macro $a{map}),  // Documentation (we are not adding any)  doc: null,  // Field visibility  access: [Access.APublic, Access.AStatic]  });  // Return the context build fields to build the type  return fields;  } } 

Usage

 @:build(MapBuilder.build(["Aaron", "Bobbi", "Carol", "Dennis", "Eric", "Frank"])) class Main {  static function main() {  trace(namesHashed.get("Bobbi"));  } } 

Learn about macros here: https://haxe.org/manual/macro.html


Contributors:
Last modified:
Created:
Category:  Macros