Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

36 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

BiDirectionalMapper

Clojars Project ci

BDM is super simple, fully declarative clj/cljc bi directional mapper that allow convert your data from A to B and back.

Usage

(ns user
  (:require [bdm.core as bdm]))

(def person
  {:name "John"
   :lastname "Smith"
   :contacts [{:type  "email"
               :value "john@smith.com"}
              {:type  "phone"
               :use   "home"
               :value "12223334455"}
			  {:type  "phone"
			   :use   "work"
			   :value "15556667788"}]})

(def mapping
  [[[:name]]
   [[:lastname]]
   [[:emails] [:contacts {:get [:= :type "email"]} :#]]
   [[:phones] [:contacts {:get [:= :type "phone"]} :#]]])

(bdm/import person mapping)

;; Will return
;; {:name "John",
;;  :lastname "Smith",
;;  :emails [{:type "email", :value "john@smith.com"}],
;;  :phones [{:type "phone", :use "home", :value "12223334455"}
;;           {:type "phone", :use "vork", :value "15556667788"}]}


;; We can do import/export roundtrip

(= person (bdm/export (bdm/import person mapping) mapping)) ;; => true

Concepts

Mapping

Mapping is a array of paths pairs. First path of pair used as setter rule and second as a getter rule.

(def mapping
  [[[:username] [:login]]])

(def user
  {:login "super-user"})

(bdm/import user mapping)
;; will return
;; {:username "super-user"}

(def imported-user
  {:username "super-user"})

(bdm/export imported-user mapping)
;; will return
;; {:login "super-user"}

In this sample we take value from user by path [:login] and set this value into result with path [:username].

Path can be deep

(def window-mapping
  [[[:hash] [:window :location :hash]]
   [[:path] [:window :location :pathname]]])

(def window
  {:window {:location {:hash     "#about"
                       :pathname "/index.html"}}})

(bdm/import window window-mapping)
;; Will return
;; {:hash "#about"
;;  :path "/index.html"}

(def location
 {:hash "#contact"
  :path "/spa.html"})

(bdm/export location window-mapping)
;; Will return
;; {:window {:location {:hash     "#contact"
;;                      :pathname "/spa.html"}}})

Path

...

Short alias

...

Predicates and arrays

...

Setters

...

Submapping

...

Develop

# run repl
$ make repl

# run test
$ make test

Extra

For more details and usage details see tests.

MIT License Copyright (c) 2020 Marat Surmashev

About

BDM is super simple, fully declarative clj/cljc bi directional mapper.

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages