Add the parsers to parse keys.
continuous-integration/drone/push Build is passing Details

dev 0.8.1
KKlochko 2 years ago
parent 79ae13aa5a
commit 5a4b88bd08

@ -6,7 +6,8 @@
:dependencies [[org.clojure/clojure "1.11.1"] :dependencies [[org.clojure/clojure "1.11.1"]
[org.clojure/tools.cli "1.0.219"] [org.clojure/tools.cli "1.0.219"]
[org.apache.tika/tika-core "1.28.5"] [org.apache.tika/tika-core "1.28.5"]
[org.apache.tika/tika-langdetect "1.28.5"]] [org.apache.tika/tika-langdetect "1.28.5"]
[cheshire "5.12.0"]]
:main ^:skip-aot cipher-analytical-machine.core :main ^:skip-aot cipher-analytical-machine.core
:java-source-paths ["src/main/java"] :java-source-paths ["src/main/java"]
:target-path "target/%s" :target-path "target/%s"

@ -0,0 +1,9 @@
(ns cipher-analytical-machine.parsers.parsers
(:require [cheshire.core :as cc])
(:gen-class))
(defn unsigned-int?
[str]
(if (re-matches #"\d+" str)
true false))

@ -0,0 +1,44 @@
(ns cipher-analytical-machine.parsers.simple-substitution
(:require
[cipher-analytical-machine.ciphers.simple-substitution :as ss]
[cipher-analytical-machine.parsers.parsers :as ps]
[cheshire.core :as cc])
(:gen-class))
(defn encode-key-and-substitution-table-to-json
[key substitution-table]
(-> {"key" key}
(assoc "table" substitution-table)
(cc/generate-string)))
(defn decode-key
"Returns the first character if the string is a char. Return the number if the string is a number."
[str]
(if (ps/unsigned-int? str)
(Integer/parseInt str)
(first str)))
(defn decode-pair
"Decode a numbers as a string and a char as a string"
[acc [key value]]
(if (ps/unsigned-int? key)
(assoc acc (decode-key key) (decode-key value))
(assoc acc (decode-key key) value)))
(defn decode-substitution-table
[substitution-table-map-from-json]
(reduce decode-pair {} substitution-table-map-from-json))
(defn decode-key-and-substitution-table-from-json
[json]
(let [data (cc/parse-string json)]
(assoc data "table" (decode-substitution-table (get data "table")))))
(defn generate-table-or-decode-json
"It generate the table and return map with the key and the table if the argument is a key. Else it decode the json."
[key-or-json symbols]
(if (ps/unsigned-int? key-or-json)
(-> {"key" key-or-json}
(assoc "table" (ss/generate-substitution-table symbols)))
(decode-key-and-substitution-table-from-json key-or-json)))

@ -0,0 +1,15 @@
(ns cipher-analytical-machine.parsers.parsers-test
(:require
[clojure.test :refer :all]
[cipher-analytical-machine.parsers.parsers :refer :all]))
(deftest unsigned-int?-test
(testing ""
(are [str expected]
(= expected
(unsigned-int? str))
"9" true
"10" true
"-10" false
"abc" false)))

@ -0,0 +1,41 @@
(ns cipher-analytical-machine.parsers.simple-substitution-test
(:require
[clojure.test :refer :all]
[cipher-analytical-machine.parsers.simple-substitution :refer :all]))
(deftest encode-key-and-substitution-table-to-json-test
(testing "The encoder must parse the map and create a json."
(are [key table expected-json]
(= expected-json
(encode-key-and-substitution-table-to-json key table))
1 {0 \a 1 \b 2 \c} "{\"key\":1,\"table\":{\"0\":\"a\",\"1\":\"b\",\"2\":\"c\"}}"
2 {\a 0 \b 1 \c 2} "{\"key\":2,\"table\":{\"a\":0,\"b\":1,\"c\":2}}")))
(deftest decode-key-and-substitution-table-from-json-test
(testing "The decoder must parse the json and create a map."
(are [json expected-data]
(= expected-data
(decode-key-and-substitution-table-from-json json))
"{\"key\":1, \"table\":{\"0\":\"a\",\"1\":\"b\",\"2\":\"c\"}}" {"key" 1 "table" {0 \a 1 \b 2 \c}}
"{\"key\":2, \"table\":{\"a\":0,\"b\":1,\"c\":2}}" {"key" 2 "table" {\a 0 \b 1 \c 2}})))
(deftest generate-table-or-decode-json-test
(let [symbols "abc"]
(testing "The function decodes the json."
(are [json expected-data]
(= expected-data
(generate-table-or-decode-json json symbols))
"{\"key\":1, \"table\":{\"0\":\"a\",\"1\":\"b\",\"2\":\"c\"}}" {"key" 1 "table" {0 \a 1 \b 2 \c}}
"{\"key\":2, \"table\":{\"a\":0,\"b\":1,\"c\":2}}" {"key" 2 "table" {\a 0 \b 1 \c 2}}))
(testing "The function generates the table, because the argument is a key."
(are [json expected-data]
(let [data (generate-table-or-decode-json json symbols)]
(and (= (get expected-data "key")
(get data "key"))
(= (keys (get expected-data "table"))
(keys (get data "table"))))
(generate-table-or-decode-json json symbols))
"1" {"key" 1 "table" {0 \a 1 \b 2 \c}}
"2" {"key" 2 "table" {\a 0 \b 1 \c 2}}))))
Loading…
Cancel
Save