From 954bb0110b35397cb458359f2b3b5c51129a7660 Mon Sep 17 00:00:00 2001 From: Franz Knipp Date: Fri, 2 Oct 2020 15:51:37 +0000 Subject: [PATCH] Add structure and IPv4 address generator --- FieldGenerator.ts | 18 ++++++++++++++++++ LineGenerator.ts | 22 ++++++++++++++++++++++ config.ts | 19 +++++++++++++++++++ generate.ts | 12 ++++++++++++ generators/index.ts | 9 +++++++++ generators/ipv4.ts | 12 ++++++++++++ makeFormatter.ts | 21 +++++++++++++++++++++ random/ip.ts | 9 +++++++++ random/number.ts | 31 +++++++++++++++++++++++++++++++ 9 files changed, 153 insertions(+) create mode 100644 FieldGenerator.ts create mode 100644 LineGenerator.ts create mode 100644 config.ts create mode 100644 generate.ts create mode 100644 generators/index.ts create mode 100644 generators/ipv4.ts create mode 100644 makeFormatter.ts create mode 100644 random/ip.ts create mode 100644 random/number.ts diff --git a/FieldGenerator.ts b/FieldGenerator.ts new file mode 100644 index 0000000..f4017a0 --- /dev/null +++ b/FieldGenerator.ts @@ -0,0 +1,18 @@ +import generators from "./generators/index.ts"; + +export interface Field { + type: string; + name?: string; + config?: object; +} + +function* FieldGenerator(f: Field) { + const generator = generators[f.type](f.config); + + while (true) { + const value = generator.next().value; + yield value; + } +} + +export default FieldGenerator; diff --git a/LineGenerator.ts b/LineGenerator.ts new file mode 100644 index 0000000..f229c46 --- /dev/null +++ b/LineGenerator.ts @@ -0,0 +1,22 @@ +import FieldGenerator, { Field } from "./FieldGenerator.ts"; +import { getInteger, NumberOrNumberConfig } from "./random/number.ts"; + +interface Config { + lines: NumberOrNumberConfig; + fields: Field[]; +} + +function* LineGenerator(config: Config) { + const { lines = 10, fields } = config; + const fieldGenerators = fields.map((f) => FieldGenerator(f)); + + const realLines = getInteger(lines); + + for (let i = 0; i < realLines; i++) { + yield Array.from(fieldGenerators).map((generator) => + generator.next().value + ); + } +} + +export default LineGenerator; diff --git a/config.ts b/config.ts new file mode 100644 index 0000000..08e28fb --- /dev/null +++ b/config.ts @@ -0,0 +1,19 @@ +export default { + fieldSeparator: ",", + lineSeparator: "\n", + lines: { min: 30000, max: 40000 }, + fields: [ + { + type: "ipv4", + name: "source", + config: { + number: { min: 10, max: 10 }, + distribution: "linear", + }, + }, + // { + // type: "ipv4", + // name: "target", + // }, + ], +}; diff --git a/generate.ts b/generate.ts new file mode 100644 index 0000000..481ffb0 --- /dev/null +++ b/generate.ts @@ -0,0 +1,12 @@ +import { printf } from "https://deno.land/std@0.71.0/fmt/printf.ts"; + +import config from "./config.ts"; +import LineGenerator from "./LineGenerator.ts"; +import makeFormatter from "./makeFormatter.ts"; + +const lineGenerator = LineGenerator(config); +const formatter = makeFormatter(config); + +for (let data of lineGenerator) { + printf(formatter(data)); +} diff --git a/generators/index.ts b/generators/index.ts new file mode 100644 index 0000000..c36223e --- /dev/null +++ b/generators/index.ts @@ -0,0 +1,9 @@ +import ipv4 from "./ipv4.ts"; + +interface Generators { + [index: string]: (config: any) => any; +} + +const generators: Generators = { ipv4 }; + +export default generators; diff --git a/generators/ipv4.ts b/generators/ipv4.ts new file mode 100644 index 0000000..8371016 --- /dev/null +++ b/generators/ipv4.ts @@ -0,0 +1,12 @@ +import { getInteger } from "../random/number.ts"; +import { getIPv4 } from "../random/ip.ts"; + +export default function* ({ number = 100, distribution = "uniform" } = {}) { + const realNumber = getInteger(number); + const addresses = new Array(realNumber).fill(0).map((x) => getIPv4()); + + while (true) { + const ipAddress = addresses[getInteger({ max: realNumber, distribution })]; + yield ipAddress; + } +} diff --git a/makeFormatter.ts b/makeFormatter.ts new file mode 100644 index 0000000..e1d4d3e --- /dev/null +++ b/makeFormatter.ts @@ -0,0 +1,21 @@ +import { sprintf } from "https://deno.land/std@0.71.0/fmt/printf.ts"; + +interface Config { + fieldSeparator: string; + lineSeparator: string; + format?: string; +} + +function makeFormatter( + { fieldSeparator = ",", lineSeparator = "\n", format }: Config, +) { + return (data: any[]) => { + if (format) { + return sprintf(format, ...data); + } else { + return sprintf(`%s${lineSeparator}`, data.join(fieldSeparator)); + } + }; +} + +export default makeFormatter; diff --git a/random/ip.ts b/random/ip.ts new file mode 100644 index 0000000..66180cd --- /dev/null +++ b/random/ip.ts @@ -0,0 +1,9 @@ +import { getInteger } from "./number.ts"; + +const numberConfig = { min: 0, max: 256 }; + +export function getIPv4() { + return `${getInteger({ min: 1, max: 256 })}.${getInteger(numberConfig)}.${ + getInteger(numberConfig) + }.${getInteger(numberConfig)}`; +} diff --git a/random/number.ts b/random/number.ts new file mode 100644 index 0000000..1ba7dbc --- /dev/null +++ b/random/number.ts @@ -0,0 +1,31 @@ +interface NumberConfig { + min?: number; + max?: number; + distribution?: string; +} + +export type NumberOrNumberConfig = number | NumberConfig; + +interface Functions { + [index: string]: (x: number) => number; +} + +const functions: Functions = { + uniform: (x) => x, + linear: (x) => Math.sqrt(x), +}; + +export function getNumber(config: NumberOrNumberConfig) { + if (typeof config === "number") { + return config; + } + + const { min = 0, max = 1, distribution = "uniform" } = config; + + const weightedRandom = functions[distribution](Math.random()); + return min + (max - min) * weightedRandom; +} + +export function getInteger(config: NumberOrNumberConfig) { + return Math.floor(getNumber(config)); +} -- 2.51.2