commit b5f4b0d36876245f5831f5d10d0f7184a8aba6a5 Author: Alberto Restifo Date: Fri Apr 17 14:32:43 2020 +0200 Initialize library diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..163eb75 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*.cr] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0bbd4a9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +/docs/ +/lib/ +/bin/ +/.shards/ +*.dwarf + +# Libraries don't need dependency lock +# Dependencies will be locked in applications that use them +/shard.lock diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..765f0e9 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,6 @@ +language: crystal + +# Uncomment the following if you'd like Travis to run specs and check code formatting +# script: +# - crystal spec +# - crystal tool format --check diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8106b2d --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2020 Alberto Restifo + +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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..84cb50d --- /dev/null +++ b/README.md @@ -0,0 +1,42 @@ +# CBOR + +This library implements the [RFC7049: Concise Binary Object Representation (CBOR)][rfc] +in Crystal. + +## Installation + +1. Add the dependency to your `shard.yml`: + + ```yaml + dependencies: + cbor: + github: your-github-user/cbor + ``` + +2. Run `shards install` + +## Usage + +```crystal +require "cbor" +``` + +TODO: Write usage instructions here + +## Development + +TODO: Write development instructions here + +## Contributing + +1. Fork it () +2. Create your feature branch (`git checkout -b my-new-feature`) +3. Commit your changes (`git commit -am 'Add some feature'`) +4. Push to the branch (`git push origin my-new-feature`) +5. Create a new Pull Request + +## Contributors + +- [Alberto Restifo](https://github.com/your-github-user) - creator and maintainer + +[rfc]: https://tools.ietf.org/html/rfc7049 diff --git a/shard.yml b/shard.yml new file mode 100644 index 0000000..543d62e --- /dev/null +++ b/shard.yml @@ -0,0 +1,9 @@ +name: cbor +version: 0.1.0 + +authors: + - Alberto Restifo + +crystal: 0.34.0 + +license: MIT diff --git a/spec/cbor_spec.cr b/spec/cbor_spec.cr new file mode 100644 index 0000000..844aab6 --- /dev/null +++ b/spec/cbor_spec.cr @@ -0,0 +1,9 @@ +require "./spec_helper" + +describe CBOR do + # TODO: Write tests + + it "works" do + false.should eq(true) + end +end diff --git a/spec/spec_helper.cr b/spec/spec_helper.cr new file mode 100644 index 0000000..d480eb5 --- /dev/null +++ b/spec/spec_helper.cr @@ -0,0 +1,2 @@ +require "spec" +require "../src/cbor" diff --git a/src/cbor.cr b/src/cbor.cr new file mode 100644 index 0000000..5ca810a --- /dev/null +++ b/src/cbor.cr @@ -0,0 +1,8 @@ +require "./cbor/**" + +# TODO: Write documentation for `CBOR` +module CBOR + VERSION = "0.1.0" + + # TODO: Put your code here +end diff --git a/src/cbor/lexer.cr b/src/cbor/lexer.cr new file mode 100644 index 0000000..2a5c9e9 --- /dev/null +++ b/src/cbor/lexer.cr @@ -0,0 +1,35 @@ +require "./token" + +class CBOR::Lexer + @current_byte : UInt8 + + def initialize(@io : IO) + @current_byte = 0x0 + end + + def next_token : Token? + byte = @io.read_byte + return nil if byte.nil? + + @current_byte = byte + + # See: RFC7049 Appedix B + case @current_byte + when .<= 0x17 + Token.new(kind: Token::Kind::UInt, value: @curren_byte) + when 0x18 + read_uint8 + end + end + + private def read_uint8 + byte = @io.read_byte + return unexpect_eof if byte.nil? + + Token.new(kind: Token::Kind::UInt, value: byte) + end + + private def unexpected_eof + raise "Unexpected EOF" + end +end diff --git a/src/cbor/token.cr b/src/cbor/token.cr new file mode 100644 index 0000000..a5079cd --- /dev/null +++ b/src/cbor/token.cr @@ -0,0 +1,14 @@ +class CBOR::Token(T) + enum Kind + UInt8 + NInt + Byte + Text + Array + Map + Float + end + + def initialize(@value : T, @kind : Kind) + end +end