summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHumble Penguin <humblepenguinoffical@gmail.com>2023-04-05 03:47:41 +0500
committerHumble Penguin <humblepenguinoffical@gmail.com>2023-04-05 03:47:41 +0500
commit1a1b7b12bf5ccca715a758feea4459aad5bf792f (patch)
tree84306f104c749d190d5f409d1d098c5d60074510
Initial Commitv0.1.0
-rw-r--r--.github/ISSUE_TEMPLATE/bug_report.md31
-rw-r--r--.github/dependabot.yml11
-rw-r--r--.github/workflows/CICD.yml344
-rw-r--r--.gitignore4
-rw-r--r--CHANGELOG.md9
-rw-r--r--CODEOWNERS2
-rw-r--r--CODE_OF_CONDUCT.md77
-rw-r--r--CONTRIBUTING.md62
-rw-r--r--Cargo.lock1704
-rw-r--r--Cargo.toml36
-rw-r--r--LICENSE-APACHE202
-rw-r--r--LICENSE-MIT21
-rw-r--r--README.md134
-rw-r--r--build.rs127
-rw-r--r--completions/_tmplt215
-rw-r--r--completions/_tmplt.ps1100
-rw-r--r--completions/tmplt.bash276
-rw-r--r--completions/tmplt.fish21
-rw-r--r--docs/build_from_source.md39
-rw-r--r--docs/project_layout.md15
-rw-r--r--docs/usage.md80
-rw-r--r--man/tmplt.134
-rw-r--r--src/cli.rs29
-rw-r--r--src/command.rs387
-rw-r--r--src/error_macro.rs6
-rw-r--r--src/main.rs52
-rw-r--r--src/parser.rs192
-rw-r--r--src/progress_bar.rs63
-rw-r--r--src/utils.rs70
-rw-r--r--src/version.rs261
30 files changed, 4604 insertions, 0 deletions
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 0000000..d957f38
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,31 @@
+---
+name: Bug report
+about: Create a report to help us improve
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+**Describe the bug**
+A clear and concise description of what the bug is.
+
+**To Reproduce**
+Steps to reproduce the behavior:
+1. Run command '...'
+2. Go to '....'
+4. See error
+
+**Expected behavior**
+A clear and concise description of what you expected to happen.
+
+**Screenshots**
+If applicable, add screenshots to help explain your problem.
+
+**Device (please complete the following information):**
+ - OS: [e.g. iOS]
+ - Shell [e.g. zsh, bash, powershell]
+ - CLI Version [e.g. 0.1.0]
+
+**Additional context**
+Add any other context about the problem here.
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..046a67b
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,11 @@
+version: 2
+updates:
+ - package-ecosystem: cargo
+ directory: "/"
+ schedule:
+ interval: monthly
+ open-pull-requests-limit: 2
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ interval: "daily"
diff --git a/.github/workflows/CICD.yml b/.github/workflows/CICD.yml
new file mode 100644
index 0000000..8f59d0f
--- /dev/null
+++ b/.github/workflows/CICD.yml
@@ -0,0 +1,344 @@
+name: CICD
+
+env:
+ CICD_INTERMEDIATES_DIR: "_cicd-intermediates"
+
+on:
+ pull_request:
+ paths:
+ - 'src/**'
+ - '.github/**'
+ - 'Cargo.toml'
+ - 'Cargo.lock'
+ - 'build.rs'
+ push:
+ branches:
+ - main
+ paths:
+ - 'src/**'
+ - '.github/**'
+ - 'Cargo.toml'
+ - 'Cargo.lock'
+ - 'build.rs'
+ tags:
+ - "*"
+
+permissions:
+ contents: write
+
+jobs:
+ min_version:
+ name: Minimum supported rust version
+ runs-on: ubuntu-20.04
+ steps:
+ - name: Checkout source code
+ uses: actions/checkout@v3
+ - name: Get the MSRV from the package metadata
+ id: msrv
+ run: cargo metadata --no-deps --format-version 1 | jq -r '"version=" + (.packages[] | select(.name = "hyperfine").rust_version)' >> $GITHUB_OUTPUT
+ - name: Install rust toolchain (v${{ steps.msrv.outputs.version }})
+ uses: dtolnay/rust-toolchain@master
+ with:
+ toolchain: ${{ steps.msrv.outputs.version }}
+ components: clippy, rustfmt
+ - name: Run cargo fmt
+ run: cargo fmt -- --check
+ - name: Run clippy (on minimum supported rust version to prevent warnings we can't fix)
+ run: cargo clippy --locked --all-targets ${{ env.MSRV_FEATURES }}
+ - name: Run tests
+ run: cargo test --locked ${{ env.MSRV_FEATURES }}
+
+ build:
+ name: ${{ matrix.job.os }} (${{ matrix.job.target }})
+ runs-on: ${{ matrix.job.os }}
+ strategy:
+ fail-fast: false
+ matrix:
+ job:
+ - { target: x86_64-unknown-linux-gnu, os: ubuntu-20.04, use-cross: true }
+ - { target: aarch64-unknown-linux-gnu, os: ubuntu-20.04, use-cross: true }
+ - { target: arm-unknown-linux-gnueabihf , os: ubuntu-20.04, use-cross: true }
+ - { target: arm-unknown-linux-musleabihf, os: ubuntu-20.04, use-cross: true }
+ - { target: i686-unknown-linux-gnu, os: ubuntu-20.04, use-cross: true }
+ - { target: x86_64-apple-darwin, os: macos-12, }
+ - { target: x86_64-pc-windows-gnu, os: windows-2019, arch: x86_64 }
+ - { target: i686-pc-windows-msvc, os: windows-2019, arch: x86 }
+
+ env:
+ BUILD_CMD: cargo
+ steps:
+ - name: Checkout source code
+ uses: actions/checkout@v3
+
+ - name: Install prerequisites
+ shell: bash
+ run: |
+ case ${{ matrix.job.target }} in
+ arm-unknown-linux-*) sudo apt-get -y update ; sudo apt-get -y install gcc-arm-linux-gnueabihf ;;
+ aarch64-unknown-linux-gnu) sudo apt-get -y update ; sudo apt-get -y install gcc-aarch64-linux-gnu ;;
+ esac
+
+ - name: Extract crate information
+ shell: bash
+ run: |
+ echo "PROJECT_NAME=tmplt" >> $GITHUB_ENV
+ echo "PROJECT_VERSION=$(sed -n 's/^version = "\(.*\)"/\1/p' Cargo.toml | head -n1)" >> $GITHUB_ENV
+ echo "PROJECT_MAINTAINER=$(sed -n 's/^authors = \["\(.*\)"\]/\1/p' Cargo.toml)" >> $GITHUB_ENV
+ echo "PROJECT_HOMEPAGE=$(sed -n 's/^homepage = "\(.*\)"/\1/p' Cargo.toml)" >> $GITHUB_ENV
+
+ - name: Install Rust toolchain
+ uses: dtolnay/rust-toolchain@stable
+ with:
+ targets: ${{ matrix.job.target }}
+
+ - name: Show version information (Rust, cargo, GCC)
+ shell: bash
+ run: |
+ gcc --version || true
+ rustup -V
+ rustup toolchain list
+ rustup default
+ cargo -V
+ rustc -V
+
+ - name: Install cross
+ if: matrix.job.use-cross
+ uses: taiki-e/install-action@v2
+ with:
+ tool: cross
+
+ - name: Overwrite build command env variable
+ if: matrix.job.use-cross
+ shell: bash
+ run: |
+ sudo apt-get install libudev-dev
+ sudo apt-get install libssl-dev
+
+ echo "BUILD_CMD=cross" >> $GITHUB_ENV
+
+ - name: Build
+ shell: bash
+ run: |
+ $BUILD_CMD build --locked --release --target=${{ matrix.job.target }}
+
+ - name: Strip debug information from executable
+ id: strip
+ shell: bash
+ run: |
+ # Figure out suffix of binary
+ EXE_suffix=""
+ case ${{ matrix.job.target }} in
+ *-pc-windows-*) EXE_suffix=".exe" ;;
+ esac;
+
+ STRIP="strip"
+ case ${{ matrix.job.target }} in
+ arm-unknown-linux-*) STRIP="arm-linux-gnueabihf-strip" ;;
+ aarch64-unknown-linux-gnu) STRIP="aarch64-linux-gnu-strip" ;;
+ *-pc-windows-msvc) STRIP="" ;;
+ esac;
+
+ BIN_DIR="${{ env.CICD_INTERMEDIATES_DIR }}/stripped-release-bin/"
+ mkdir -p "${BIN_DIR}"
+ BIN_NAME="${{ env.PROJECT_NAME }}${EXE_suffix}"
+ BIN_PATH="${BIN_DIR}/${BIN_NAME}"
+
+ cp "target/${{ matrix.job.target }}/release/${BIN_NAME}" "${BIN_DIR}"
+
+ # Also strip if possible
+ if [ -n "${STRIP}" ]; then
+ "${STRIP}" "${BIN_PATH}"
+ fi
+
+ echo "BIN_PATH=${BIN_PATH}" >> $GITHUB_OUTPUT
+ echo "BIN_NAME=${BIN_NAME}" >> $GITHUB_OUTPUT
+
+ - name: Run tests
+ shell: bash
+ run: $BUILD_CMD test --locked --target=${{ matrix.job.target }} ${{ steps.test-options.outputs.CARGO_TEST_OPTIONS}}
+
+ - name: Create tarball
+ id: package
+ shell: bash
+ run: |
+ PKG_suffix=".tar.gz" ; case ${{ matrix.job.target }} in *-pc-windows-*) PKG_suffix=".zip" ;; esac;
+ PKG_BASENAME=${PROJECT_NAME}-v${PROJECT_VERSION}-${{ matrix.job.target }}
+ PKG_NAME=${PKG_BASENAME}${PKG_suffix}
+ echo "PKG_NAME=${PKG_NAME}" >> $GITHUB_OUTPUT
+
+ PKG_STAGING="${{ env.CICD_INTERMEDIATES_DIR }}/package"
+ ARCHIVE_DIR="${PKG_STAGING}/${PKG_BASENAME}/"
+ mkdir -p "${ARCHIVE_DIR}"
+ mkdir -p "${ARCHIVE_DIR}/autocomplete"
+
+ cp "${{ steps.strip.outputs.BIN_PATH }}" "$ARCHIVE_DIR"
+
+ cp 'man/${{ env.PROJECT_NAME }}.1' "$ARCHIVE_DIR"
+
+ cp "README.md" "LICENSE-MIT" "LICENSE-APACHE" "CHANGELOG.md" "$ARCHIVE_DIR"
+
+ cp completions/'${{ env.PROJECT_NAME }}.bash' "$ARCHIVE_DIR/autocomplete/"
+ cp completions/'${{ env.PROJECT_NAME }}.fish' "$ARCHIVE_DIR/autocomplete/"
+ cp completions/'_${{ env.PROJECT_NAME }}' "$ARCHIVE_DIR/autocomplete/"
+ cp completions/'_${{ env.PROJECT_NAME }}.ps1' "$ARCHIVE_DIR/autocomplete/"
+
+ pushd "${PKG_STAGING}/" >/dev/null
+ case ${{ matrix.job.target }} in
+ *-pc-windows-*) 7z -y a "${PKG_NAME}" "${PKG_BASENAME}"/* | tail -2 ;;
+ *) tar czf "${PKG_NAME}" "${PKG_BASENAME}"/* ;;
+ esac;
+ popd >/dev/null
+
+ echo "PKG_PATH=${PKG_STAGING}/${PKG_NAME}" >> $GITHUB_OUTPUT
+
+ - name: Create Debian package
+ id: debian-package
+ shell: bash
+ if: startsWith(matrix.job.os, 'ubuntu')
+ run: |
+ COPYRIGHT_YEARS="2023 - "$(date "+%Y")
+ DPKG_STAGING="${{ env.CICD_INTERMEDIATES_DIR }}/debian-package"
+ DPKG_DIR="${DPKG_STAGING}/dpkg"
+ mkdir -p "${DPKG_DIR}"
+ DPKG_BASENAME=${PROJECT_NAME}
+ DPKG_CONFLICTS=${PROJECT_NAME}-musl
+ case ${{ matrix.job.target }} in *-musl) DPKG_BASENAME=${PROJECT_NAME}-musl ; DPKG_CONFLICTS=${PROJECT_NAME} ;; esac;
+ DPKG_VERSION=${PROJECT_VERSION}
+ unset DPKG_ARCH
+ case ${{ matrix.job.target }} in
+ aarch64-*-linux-*) DPKG_ARCH=arm64 ;;
+ arm-*-linux-*hf) DPKG_ARCH=armhf ;;
+ i686-*-linux-*) DPKG_ARCH=i686 ;;
+ x86_64-*-linux-*) DPKG_ARCH=amd64 ;;
+ *) DPKG_ARCH=notset ;;
+ esac;
+ DPKG_NAME="${DPKG_BASENAME}_${DPKG_VERSION}_${DPKG_ARCH}.deb"
+ echo "DPKG_NAME=${DPKG_NAME}" >> $GITHUB_OUTPUT
+ # Binary
+ install -Dm755 "${{ steps.strip.outputs.BIN_PATH }}" "${DPKG_DIR}/usr/bin/${{ steps.strip.outputs.BIN_NAME }}"
+ # Man page
+ install -Dm644 'man/${{ env.PROJECT_NAME }}.1' "${DPKG_DIR}/usr/share/man/man1/${{ env.PROJECT_NAME }}.1"
+ gzip -n --best "${DPKG_DIR}/usr/share/man/man1/${{ env.PROJECT_NAME }}.1"
+ # Autocompletion files
+ install -Dm644 completions/'${{ env.PROJECT_NAME }}.bash' "${DPKG_DIR}/usr/share/bash-completion/completions/${{ env.PROJECT_NAME }}"
+ install -Dm644 completions/'${{ env.PROJECT_NAME }}.fish' "${DPKG_DIR}/usr/share/fish/vendor_completions.d/${{ env.PROJECT_NAME }}.fish"
+ install -Dm644 completions/'_${{ env.PROJECT_NAME }}' "${DPKG_DIR}/usr/share/zsh/vendor-completions/_${{ env.PROJECT_NAME }}"
+ # README and LICENSE
+ install -Dm644 "README.md" "${DPKG_DIR}/usr/share/doc/${DPKG_BASENAME}/README.md"
+ install -Dm644 "LICENSE-MIT" "${DPKG_DIR}/usr/share/doc/${DPKG_BASENAME}/LICENSE-MIT"
+ install -Dm644 "LICENSE-APACHE" "${DPKG_DIR}/usr/share/doc/${DPKG_BASENAME}/LICENSE-APACHE"
+ install -Dm644 "CHANGELOG.md" "${DPKG_DIR}/usr/share/doc/${DPKG_BASENAME}/changelog"
+ gzip -n --best "${DPKG_DIR}/usr/share/doc/${DPKG_BASENAME}/changelog"
+ cat > "${DPKG_DIR}/usr/share/doc/${DPKG_BASENAME}/copyright" <<EOF
+ Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+ Upstream-Name: ${{ env.PROJECT_NAME }}
+ Source: ${{ env.PROJECT_HOMEPAGE }}
+ Files: *
+ Copyright: ${{ env.PROJECT_MAINTAINER }}
+ Copyright: $COPYRIGHT_YEARS ${{ env.PROJECT_MAINTAINER }}
+ License: Apache-2.0 or MIT
+ License: Apache-2.0
+ On Debian systems, the complete text of the Apache-2.0 can be found in the
+ file /usr/share/common-licenses/Apache-2.0.
+ License: MIT
+ Permission is hereby granted, free of charge, to any
+ person obtaining a copy of this software and associated
+ documentation files (the "Software"), to deal in the
+ Software without restriction, including without
+ limitation the rights to use, copy, modify, merge,
+ publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software
+ is furnished to do so, subject to the following
+ conditions:
+ .
+ The above copyright notice and this permission notice
+ shall be included in all copies or substantial portions
+ of the Software.
+ .
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+ SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+ IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ DEALINGS IN THE SOFTWARE.
+ EOF
+ chmod 644 "${DPKG_DIR}/usr/share/doc/${DPKG_BASENAME}/copyright"
+ # control file
+ mkdir -p "${DPKG_DIR}/DEBIAN"
+ cat > "${DPKG_DIR}/DEBIAN/control" <<EOF
+ Package: ${DPKG_BASENAME}
+ Version: ${DPKG_VERSION}
+ Section: utils
+ Priority: optional
+ Maintainer: ${{ env.PROJECT_MAINTAINER }}
+ Homepage: ${{ env.PROJECT_HOMEPAGE }}
+ Architecture: ${DPKG_ARCH}
+ Provides: ${{ env.PROJECT_NAME }}
+ Conflicts: ${DPKG_CONFLICTS}
+ Description: A command-line benchmarking tool
+ EOF
+ DPKG_PATH="${DPKG_STAGING}/${DPKG_NAME}"
+ echo "DPKG_PATH=${DPKG_PATH}" >> $GITHUB_OUTPUT
+ # build dpkg
+ fakeroot dpkg-deb --build "${DPKG_DIR}" "${DPKG_PATH}"
+
+ - name: Set path for candle and light
+ shell: bash
+ if: startsWith(matrix.job.os, 'windows')
+ run: echo "C:\Program Files (x86)\WiX Toolset v3.11\bin" >> $GITHUB_PATH
+
+ - name: Build Windows Installer
+ id: msi-installer
+ shell: bash
+ if: startsWith(matrix.job.os, 'windows')
+ run: |
+ cargo install cargo-wix
+ cargo wix init
+ cargo wix --target ${{ matrix.job.target }}
+
+ PKG_NAME=${PROJECT_NAME}-${PROJECT_VERSION}-${{ matrix.job.arch }}.msi
+
+ echo "PKG_NAME=${PKG_NAME}" >> $GITHUB_OUTPUT
+ echo "PKG_PATH=target/wix/${PKG_NAME}" >> $GITHUB_OUTPUT
+
+
+ - name: "Artifact upload: tarball"
+ uses: actions/upload-artifact@master
+ with:
+ name: ${{ steps.package.outputs.PKG_NAME }}
+ path: ${{ steps.package.outputs.PKG_PATH }}
+
+ - name: "Artifact upload: Windows installer"
+ uses: actions/upload-artifact@master
+ if: steps.msi-installer.outputs.PKG_NAME
+ with:
+ name: ${{ steps.msi-installer.outputs.PKG_NAME }}
+ path: ${{ steps.msi-installer.outputs.PKG_PATH }}
+
+ - name: "Artifact upload: Debian package"
+ uses: actions/upload-artifact@master
+ if: steps.debian-package.outputs.DPKG_NAME
+ with:
+ name: ${{ steps.debian-package.outputs.DPKG_NAME }}
+ path: ${{ steps.debian-package.outputs.DPKG_PATH }}
+
+ - name: Check for release
+ id: is-release
+ shell: bash
+ run: |
+ unset IS_RELEASE ; if [[ $GITHUB_REF =~ ^refs/tags/v[0-9].* ]]; then IS_RELEASE='true' ; fi
+ echo "IS_RELEASE=${IS_RELEASE}" >> $GITHUB_OUTPUT
+
+ - name: Publish archives and packages
+ uses: softprops/action-gh-release@v1
+ if: steps.is-release.outputs.IS_RELEASE
+ with:
+ files: |
+ ${{ steps.package.outputs.PKG_PATH }}
+ ${{ steps.msi-installer.outputs.PKG_PATH }}
+ ${{ steps.debian-package.outputs.DPKG_PATH }}
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..383240e
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+/target
+/build
+
+/.vscode
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..fe7ef15
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,9 @@
+# Change Log
+
+This document records all notable changes to [tmplt](https://github.com/humblepenguinn/tmplt).
+
+# v0.1.0
+
+- Inital Release
+
+
diff --git a/CODEOWNERS b/CODEOWNERS
new file mode 100644
index 0000000..bd4f485
--- /dev/null
+++ b/CODEOWNERS
@@ -0,0 +1,2 @@
+# default owners for everything
+* @humblepenguinn
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..1e4968a
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,77 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as
+contributors and maintainers pledge to make participation in our project and
+our community a harassment-free experience for everyone, regardless of age, body
+size, disability, ethnicity, sex characteristics, gender identity and expression,
+level of experience, education, socio-economic status, nationality, personal
+appearance, race, religion, or sexual identity and orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment
+include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or
+ advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic
+ address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+ professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable
+behavior and are expected to take appropriate and fair corrective action in
+response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or
+reject comments, commits, code, wiki edits, issues, and other contributions
+that are not aligned to this Code of Conduct, or to ban temporarily or
+permanently any contributor for other behaviors that they deem inappropriate,
+threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies within all project spaces, and it also applies when
+an individual is representing the project or its community in public spaces.
+Examples of representing a project or community include using an official
+project e-mail address, posting via an official social media account, or acting
+as an appointed representative at an online or offline event. Representation of
+a project may be further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported by contacting the project team at [INSERT EMAIL ADDRESS]. All
+complaints will be reviewed and investigated and will result in a response that
+is deemed necessary and appropriate to the circumstances. The project team is
+obligated to maintain confidentiality with regard to the reporter of an incident.
+Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good
+faith may face temporary or permanent repercussions as determined by other
+members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
+available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
+
+[homepage]: https://www.contributor-covenant.org
+
+For answers to common questions about this code of conduct, see
+https://www.contributor-covenant.org/faq
+
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..12df95a
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,62 @@
+## Contributing
+
+Thanks for your interest in contributing to tmplt!
+
+Any form of contribution is accepted, be it bug fixes, implementing a new feature or even just fixing a small typo. The goal is to get the community involved as much as possible
+
+pull requests for bug fixes and features will only be accepted if the approach has been discussed in an issue and a community memeber has been given the go-ahead to work on it
+
+Please keep the following in mind at all times:
+
+* Check existing issues to verify that the [`bug`](https://github.com/humblepenguinn/tmplt/labels/bug) or [`feature request`](https://github.com/humblepenguinn/tmplt/labels/feature%20request) has not already been submitted.
+* Open an issue if things aren't working as expected.
+* Open an issue to propose a significant change.
+* Open a pull request to fix a bug.
+
+* Open a pull request for any issue labelled [`help wanted`](https://github.com/humblepenguinn/tmplt/labels/help%20wanted), [`good first issue`](https://github.com/humblepenguinn/tmplt/labels/good%20first%20issue) or [`community`](https://github.com/humblepenguinn/tmplt/labels/community).
+
+Please avoid:
+
+* Opening pull requests for issues marked `needs-triage`, `needs-investigation`, or `blocked`.
+* Opening pull requests for any issue marked `maintainers`. These issues require additional context from
+ the maintainers/code owners and any external pull requests will not be accepted.
+
+## Building the project
+See how to [build the editor from source here](./docs/build_from_source.md)
+
+See [project layout documentation](./docs/project_layout.md) for information on where to find specific source files.
+
+## Tests
+Tests have not yet been written for `tmplt`, so maybe thats something you could create a pull request for?
+
+## Submitting a pull request
+
+1. Create a new branch: `git checkout -b my-branch-name`
+2. Make your change
+3. Run `cargo fmt --all --check`
+4. Run `cargo clippy --fix --all-features`
+5. Submit a pull request
+
+Contributions to this project are released to the public under the project's open source licenses,
+the [MIT License](LICENSE-MIT) and the [Apache License](LICENSE-APACHE)
+
+Please note that this project adheres to a [Contributor Code of Conduct][code-of-conduct]. By participating in this project you agree to abide by its terms.
+
+## Design guidelines
+Let your imagination run wild and suggest amazing ideas
+
+There isn't any strict design guidelines yet. I am still working on that, so for now the project is open to any kind of change
+
+## Resources
+
+- [How to Contribute to Open Source][]
+- [Using Pull Requests][]
+- [GitHub Help][]
+
+
+
+[code-of-conduct]: ./CODE_OF_CONDUCT.md
+[How to Contribute to Open Source]: https://opensource.guide/how-to-contribute/
+[Using Pull Requests]: https://docs.github.com/en/free-pro-team@latest/github/collaborating-with-issues-and-pull-requests/about-pull-requests
+[GitHub Help]: https://docs.github.com/
+
diff --git a/Cargo.lock b/Cargo.lock
new file mode 100644
index 0000000..20771ea
--- /dev/null
+++ b/Cargo.lock
@@ -0,0 +1,1704 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "anstream"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "342258dd14006105c2b75ab1bd7543a03bdf0cfc94383303ac212a04939dff6f"
+dependencies = [
+ "anstyle",
+ "anstyle-parse",
+ "anstyle-wincon",
+ "concolor-override",
+ "concolor-query",
+ "is-terminal",
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23ea9e81bd02e310c216d080f6223c179012256e5151c41db88d12c88a1684d2"
+
+[[package]]
+name = "anstyle-parse"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a7d1bb534e9efed14f3e5f44e7dd1a4f709384023a4165199a4241e18dff0116"
+dependencies = [
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle-wincon"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3127af6145b149f3287bb9a0d10ad9c5692dba8c53ad48285e5bec4063834fa"
+dependencies = [
+ "anstyle",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "atty"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
+dependencies = [
+ "hermit-abi 0.1.19",
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "base64"
+version = "0.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a"
+
+[[package]]
+name = "bincode"
+version = "1.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "bumpalo"
+version = "3.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535"
+
+[[package]]
+name = "bytes"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be"
+
+[[package]]
+name = "cc"
+version = "1.0.79"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f"
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "chrono"
+version = "0.4.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b"
+dependencies = [
+ "iana-time-zone",
+ "js-sys",
+ "num-integer",
+ "num-traits",
+ "serde",
+ "time",
+ "wasm-bindgen",
+ "winapi",
+]
+
+[[package]]
+name = "clap"
+version = "4.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "046ae530c528f252094e4a77886ee1374437744b2bff1497aa898bbddbbb29b3"
+dependencies = [
+ "clap_builder",
+ "clap_derive",
+ "once_cell",
+]
+
+[[package]]
+name = "clap_builder"
+version = "4.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "223163f58c9a40c3b0a43e1c4b50a9ce09f007ea2cb1ec258a687945b4b7929f"
+dependencies = [
+ "anstream",
+ "anstyle",
+ "bitflags",
+ "clap_lex",
+ "strsim",
+]
+
+[[package]]
+name = "clap_complete"
+version = "4.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "01c22dcfb410883764b29953103d9ef7bb8fe21b3fa1158bc99986c2067294bd"
+dependencies = [
+ "clap",
+]
+
+[[package]]
+name = "clap_derive"
+version = "4.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9644cd56d6b87dbe899ef8b053e331c0637664e9e21a33dfcdc36093f5c5c4"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.13",
+]
+
+[[package]]
+name = "clap_lex"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a2dd5a6fe8c6e3502f568a6353e5273bbb15193ad9a89e457b9970798efbea1"
+
+[[package]]
+name = "clap_mangen"
+version = "0.2.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4237e29de9c6949982ba87d51709204504fb8ed2fd38232fcb1e5bf7d4ba48c8"
+dependencies = [
+ "clap",
+ "roff",
+]
+
+[[package]]
+name = "codespan-reporting"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e"
+dependencies = [
+ "termcolor",
+ "unicode-width",
+]
+
+[[package]]
+name = "colored"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b3616f750b84d8f0de8a58bda93e08e2a81ad3f523089b05f1dffecab48c6cbd"
+dependencies = [
+ "atty",
+ "lazy_static",
+ "winapi",
+]
+
+[[package]]
+name = "concolor-override"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a855d4a1978dc52fb0536a04d384c2c0c1aa273597f08b77c8c4d3b2eec6037f"
+
+[[package]]
+name = "concolor-query"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "88d11d52c3d7ca2e6d0040212be9e4dbbcd78b6447f535b6b561f449427944cf"
+dependencies = [
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "console"
+version = "0.15.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3d79fbe8970a77e3e34151cc13d3b3e248aa0faaecb9f6091fa07ebefe5ad60"
+dependencies = [
+ "encode_unicode",
+ "lazy_static",
+ "libc",
+ "unicode-width",
+ "windows-sys 0.42.0",
+]
+
+[[package]]
+name = "core-foundation"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/cr