serde 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +3 -0
- data/Gemfile +7 -0
- data/Gemfile.lock +63 -0
- data/LICENSE +21 -0
- data/README.md +19 -0
- data/examples/app/Gemfile +1 -0
- data/examples/app/Gemfile.lock +16 -0
- data/examples/app/new.rb +22 -0
- data/lib/serde/generate.rb +50 -0
- data/lib/serde/serializer_generator.rb +82 -0
- data/lib/serde.rb +33 -0
- data/rust/.gitignore +2 -0
- data/rust/Cargo.lock +85 -0
- data/rust/Cargo.toml +13 -0
- data/rust/src/.keep +0 -0
- data/serde.gemspec +29 -0
- data/templates/c/serde_rb.c +15 -0
- data/templates/extension/serde_rb/extconf.rb +5 -0
- data/templates/rust/lib.rs +21 -0
- data/templates/rust/mod.rs +6 -0
- metadata +120 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 56ecad527ba63b8bab91bf3c1f6f69db7b47a2154e61d79163a5a998683682d0
|
4
|
+
data.tar.gz: 36c782fa69b87ed6e44273b11a73d136665b2e66194d4d6a42d9a9c6f180518e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 403cd1c381aeb30ee51cb793ee4fb16b07768d982d6e6654ef498840c66c48584263f7e7590077a43ad31a157341b9f274d8377c102f762714f63ee47b9993ee
|
7
|
+
data.tar.gz: ae956ed2dd8d82640ea69cc8011308ec904c71019e910136d41cd989d1ebe7c43e09f263d7eb1abee3feeb08c3fcaa1486fefef0b818af331fcd1d8f94d55ba0
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
serde (0.1.0)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: https://rubygems.org/
|
8
|
+
specs:
|
9
|
+
ast (2.4.0)
|
10
|
+
benchmark-ips (2.7.2)
|
11
|
+
coderay (1.1.2)
|
12
|
+
diff-lcs (1.3)
|
13
|
+
jaro_winkler (1.5.1)
|
14
|
+
method_source (0.9.2)
|
15
|
+
oj (3.7.1)
|
16
|
+
parallel (1.12.1)
|
17
|
+
parser (2.5.3.0)
|
18
|
+
ast (~> 2.4.0)
|
19
|
+
powerpack (0.1.2)
|
20
|
+
pry (0.12.2)
|
21
|
+
coderay (~> 1.1.0)
|
22
|
+
method_source (~> 0.9.0)
|
23
|
+
rainbow (3.0.0)
|
24
|
+
rspec (3.8.0)
|
25
|
+
rspec-core (~> 3.8.0)
|
26
|
+
rspec-expectations (~> 3.8.0)
|
27
|
+
rspec-mocks (~> 3.8.0)
|
28
|
+
rspec-core (3.8.0)
|
29
|
+
rspec-support (~> 3.8.0)
|
30
|
+
rspec-expectations (3.8.2)
|
31
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
32
|
+
rspec-support (~> 3.8.0)
|
33
|
+
rspec-mocks (3.8.0)
|
34
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
35
|
+
rspec-support (~> 3.8.0)
|
36
|
+
rspec-support (3.8.0)
|
37
|
+
rubocop (0.60.0)
|
38
|
+
jaro_winkler (~> 1.5.1)
|
39
|
+
parallel (~> 1.10)
|
40
|
+
parser (>= 2.5, != 2.5.1.1)
|
41
|
+
powerpack (~> 0.1)
|
42
|
+
rainbow (>= 2.2.2, < 4.0)
|
43
|
+
ruby-progressbar (~> 1.7)
|
44
|
+
unicode-display_width (~> 1.4.0)
|
45
|
+
ruby-progressbar (1.10.0)
|
46
|
+
surrealist (1.3.1)
|
47
|
+
oj (~> 3.0)
|
48
|
+
unicode-display_width (1.4.0)
|
49
|
+
|
50
|
+
PLATFORMS
|
51
|
+
ruby
|
52
|
+
|
53
|
+
DEPENDENCIES
|
54
|
+
benchmark-ips
|
55
|
+
bundler (~> 1.17)
|
56
|
+
pry (~> 0.12)
|
57
|
+
rspec (~> 3.8)
|
58
|
+
rubocop (~> 0.60)
|
59
|
+
serde!
|
60
|
+
surrealist
|
61
|
+
|
62
|
+
BUNDLED WITH
|
63
|
+
1.17.1
|
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2018 Alexander Komarov
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# serde.rb
|
2
|
+
|
3
|
+
WIP
|
4
|
+
|
5
|
+
# TODO:
|
6
|
+
|
7
|
+
- [ ] Write the README
|
8
|
+
- [ ] Use a temporary directory instead of `_target_`
|
9
|
+
- [ ] Write specs
|
10
|
+
- [ ] Set up rubocop
|
11
|
+
- [ ] Set up CI
|
12
|
+
- [ ] Reuse Rust crate, but generate sources in a temp dir
|
13
|
+
- [ ] Cover all basic types (Integer, String, Float, Boolean)
|
14
|
+
- [ ] Nullable types
|
15
|
+
- [ ] Composite types (ArrayOf, HashMap?, Enum)
|
16
|
+
- [ ] Vendor `rustc` with the gem
|
17
|
+
- [ ] Write benchmarks, compare with Surrealist
|
18
|
+
- [ ] Allow dynamic hashes?
|
19
|
+
- [ ] Type checks and coercions?
|
@@ -0,0 +1 @@
|
|
1
|
+
gem 'serde', path: '../..'
|
data/examples/app/new.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'serde'
|
5
|
+
|
6
|
+
class CowSerializer < Serde::Serializer
|
7
|
+
schema(
|
8
|
+
id: Integer,
|
9
|
+
name: String,
|
10
|
+
)
|
11
|
+
end
|
12
|
+
|
13
|
+
class Cow
|
14
|
+
attr_reader :id, :name
|
15
|
+
|
16
|
+
def initialize(id, name)
|
17
|
+
@id = id
|
18
|
+
@name = name
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
puts CowSerializer.new(Cow.new(1, 'Ковыч')).to_json
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'erb'
|
2
|
+
|
3
|
+
def generate_serializers
|
4
|
+
def underscore(str)
|
5
|
+
str.tr('::', '/')
|
6
|
+
.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
|
7
|
+
.gsub(/([a-z\d])([A-Z])/, '\1_\2')
|
8
|
+
.tr('-', '_')
|
9
|
+
.downcase
|
10
|
+
end
|
11
|
+
|
12
|
+
modules = []
|
13
|
+
|
14
|
+
Serde.subclasses.each do |klass|
|
15
|
+
schema = klass.instance_variable_get(:@schema)
|
16
|
+
raise 'pls define a schema' if schema.nil?
|
17
|
+
|
18
|
+
module_name = underscore(klass.name)
|
19
|
+
fields = schema.map do |k, v|
|
20
|
+
type =
|
21
|
+
case v.to_s
|
22
|
+
when 'Integer' then 'i64'
|
23
|
+
when 'Float' then 'f64'
|
24
|
+
else v.to_s
|
25
|
+
end
|
26
|
+
{ name: k, type: type }
|
27
|
+
end
|
28
|
+
|
29
|
+
modules << {
|
30
|
+
class_name: klass.name,
|
31
|
+
name: module_name,
|
32
|
+
fields: fields,
|
33
|
+
joint_fields: fields.map do |field|
|
34
|
+
"#{field[:name]}: #{field[:type]}"
|
35
|
+
end.join(', ')
|
36
|
+
}
|
37
|
+
|
38
|
+
mod_template = ERB.new(File.read('./rust_template/mod.rs.erb'))
|
39
|
+
compiled_template = mod_template.result(binding)
|
40
|
+
|
41
|
+
File.open("./src/#{module_name}.rs", 'w') { |f| f.write(compiled_template) }
|
42
|
+
end
|
43
|
+
|
44
|
+
lib_template = ERB.new(File.read('./rust_template/lib.rs.erb'))
|
45
|
+
compiled_template = lib_template.result(binding)
|
46
|
+
|
47
|
+
File.open("./src/lib.rs", 'w') { |f| f.write(compiled_template) }
|
48
|
+
|
49
|
+
`rake build`
|
50
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'erb'
|
4
|
+
|
5
|
+
module Serde
|
6
|
+
module SerializerGenerator
|
7
|
+
class << self
|
8
|
+
def call(klass)
|
9
|
+
schema = klass.instance_variable_get(:@schema)
|
10
|
+
|
11
|
+
name = underscore(klass.name)
|
12
|
+
fields = schema.map do |k, v|
|
13
|
+
v = v.to_s
|
14
|
+
type =
|
15
|
+
case v
|
16
|
+
when 'Integer' then 'i64'
|
17
|
+
when 'Float' then 'f64'
|
18
|
+
else v
|
19
|
+
end
|
20
|
+
ctype =
|
21
|
+
case v
|
22
|
+
when 'Integer' then 'int'
|
23
|
+
when 'String' then 'char*'
|
24
|
+
end
|
25
|
+
cdecl =
|
26
|
+
case v
|
27
|
+
when 'Integer' then "int c_#{k} = NUM2INT(#{k});"
|
28
|
+
when 'String' then "char* c_#{k} = StringValueCStr(#{k});"
|
29
|
+
end
|
30
|
+
rctype =
|
31
|
+
case v
|
32
|
+
when 'String' then '*const c_char'
|
33
|
+
when 'Integer' then 'i64'
|
34
|
+
when 'Float' then 'f64'
|
35
|
+
else v
|
36
|
+
end
|
37
|
+
{ name: k, type: type, rctype: rctype, cdecl: cdecl, ctype: ctype }
|
38
|
+
end
|
39
|
+
|
40
|
+
serializer = {
|
41
|
+
class_name: klass.name,
|
42
|
+
name: name,
|
43
|
+
fields: fields,
|
44
|
+
joint_fields: fields.map do |field|
|
45
|
+
"#{field[:name]}: #{field[:type]}"
|
46
|
+
end.join(', '),
|
47
|
+
joint_fields_rctype: fields.map do |field|
|
48
|
+
"#{field[:name]}: #{field[:rctype]}"
|
49
|
+
end.join(', '),
|
50
|
+
joint_fields_c: fields.map do |field|
|
51
|
+
"#{field[:ctype]} #{field[:name]}"
|
52
|
+
end.join(', '),
|
53
|
+
}
|
54
|
+
|
55
|
+
mod_template = ERB.new(File.read('./templates/rust/mod.rs'))
|
56
|
+
compiled_template = mod_template.result(binding)
|
57
|
+
|
58
|
+
File.write("./rust/src/#{name}.rs", compiled_template)
|
59
|
+
|
60
|
+
c_template = ERB.new(File.read('./templates/c/serde_rb.c'))
|
61
|
+
compiled_template = c_template.result(binding)
|
62
|
+
|
63
|
+
File.write('./_target_/serde_rb/serde_rb.c', compiled_template)
|
64
|
+
|
65
|
+
lib_template = ERB.new(File.read('./templates/rust/lib.rs'))
|
66
|
+
compiled_template = lib_template.result(binding)
|
67
|
+
|
68
|
+
File.write("./rust/src/lib.rs", compiled_template)
|
69
|
+
end
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
def underscore(str)
|
74
|
+
str.tr('::', '/')
|
75
|
+
.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
|
76
|
+
.gsub(/([a-z\d])([A-Z])/, '\1_\2')
|
77
|
+
.tr('-', '_')
|
78
|
+
.downcase
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
data/lib/serde.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require_relative 'serde/serializer_generator.rb'
|
3
|
+
|
4
|
+
FileUtils.rm_r(Dir.glob('_target_/*'))
|
5
|
+
FileUtils.cp_r(Dir.glob('templates/extension/*'), '_target_')
|
6
|
+
|
7
|
+
module Serde
|
8
|
+
class Serializer
|
9
|
+
class << self
|
10
|
+
def schema(**attrs)
|
11
|
+
@schema = attrs
|
12
|
+
SerializerGenerator.call(self)
|
13
|
+
Dir.chdir(File.expand_path('../_target_', __dir__)) do
|
14
|
+
`make`
|
15
|
+
end
|
16
|
+
|
17
|
+
require_relative '../_target_/serde_rb/serde_rb'
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_schema
|
21
|
+
@schema
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def initialize(object)
|
26
|
+
@args = self.class.get_schema.keys.map { |k| object.public_send(k) }
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_json
|
30
|
+
internal_to_json(*@args)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/rust/.gitignore
ADDED
data/rust/Cargo.lock
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
[[package]]
|
2
|
+
name = "itoa"
|
3
|
+
version = "0.4.3"
|
4
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
5
|
+
|
6
|
+
[[package]]
|
7
|
+
name = "proc-macro2"
|
8
|
+
version = "0.4.24"
|
9
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
10
|
+
dependencies = [
|
11
|
+
"unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
12
|
+
]
|
13
|
+
|
14
|
+
[[package]]
|
15
|
+
name = "quote"
|
16
|
+
version = "0.6.10"
|
17
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
18
|
+
dependencies = [
|
19
|
+
"proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
20
|
+
]
|
21
|
+
|
22
|
+
[[package]]
|
23
|
+
name = "ryu"
|
24
|
+
version = "0.2.7"
|
25
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
26
|
+
|
27
|
+
[[package]]
|
28
|
+
name = "serde"
|
29
|
+
version = "1.0.80"
|
30
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
31
|
+
|
32
|
+
[[package]]
|
33
|
+
name = "serde_derive"
|
34
|
+
version = "1.0.80"
|
35
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
36
|
+
dependencies = [
|
37
|
+
"proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
38
|
+
"quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
39
|
+
"syn 0.15.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
40
|
+
]
|
41
|
+
|
42
|
+
[[package]]
|
43
|
+
name = "serde_json"
|
44
|
+
version = "1.0.33"
|
45
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
46
|
+
dependencies = [
|
47
|
+
"itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
48
|
+
"ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
49
|
+
"serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
|
50
|
+
]
|
51
|
+
|
52
|
+
[[package]]
|
53
|
+
name = "serde_rb"
|
54
|
+
version = "0.0.1"
|
55
|
+
dependencies = [
|
56
|
+
"serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
|
57
|
+
"serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
|
58
|
+
"serde_json 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)",
|
59
|
+
]
|
60
|
+
|
61
|
+
[[package]]
|
62
|
+
name = "syn"
|
63
|
+
version = "0.15.22"
|
64
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
65
|
+
dependencies = [
|
66
|
+
"proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
67
|
+
"quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
68
|
+
"unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
69
|
+
]
|
70
|
+
|
71
|
+
[[package]]
|
72
|
+
name = "unicode-xid"
|
73
|
+
version = "0.1.0"
|
74
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
75
|
+
|
76
|
+
[metadata]
|
77
|
+
"checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b"
|
78
|
+
"checksum proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)" = "77619697826f31a02ae974457af0b29b723e5619e113e9397b8b82c6bd253f09"
|
79
|
+
"checksum quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "53fa22a1994bd0f9372d7a816207d8a2677ad0325b073f5c5332760f0fb62b5c"
|
80
|
+
"checksum ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "eb9e9b8cde282a9fe6a42dd4681319bfb63f121b8a8ee9439c6f4107e58a46f7"
|
81
|
+
"checksum serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)" = "15c141fc7027dd265a47c090bf864cf62b42c4d228bbcf4e51a0c9e2b0d3f7ef"
|
82
|
+
"checksum serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)" = "225de307c6302bec3898c51ca302fc94a7a1697ef0845fcee6448f33c032249c"
|
83
|
+
"checksum serde_json 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)" = "c37ccd6be3ed1fdf419ee848f7c758eb31b054d7cd3ae3600e3bae0adf569811"
|
84
|
+
"checksum syn 0.15.22 (registry+https://github.com/rust-lang/crates.io-index)" = "ae8b29eb5210bc5cf63ed6149cbf9adfc82ac0be023d8735c176ee74a2db4da7"
|
85
|
+
"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
|
data/rust/Cargo.toml
ADDED
data/rust/src/.keep
ADDED
File without changes
|
data/serde.gemspec
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path('../lib', __dir__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.required_ruby_version = '>= 2.5.0'
|
8
|
+
|
9
|
+
spec.name = 'serde'
|
10
|
+
spec.version = '0.0.1'
|
11
|
+
spec.authors = ['Alexander Komarov']
|
12
|
+
spec.email = %w[ak@akxcv.com]
|
13
|
+
|
14
|
+
spec.summary = %q(Fast, compiled serializers for Ruby.)
|
15
|
+
spec.description = %q(Fast, compiled serializers for Ruby. Powered by serde.rs.)
|
16
|
+
spec.homepage = 'https://github.com/akxcv/serde.rb'
|
17
|
+
spec.license = 'MIT'
|
18
|
+
|
19
|
+
spec.require_paths = %w[lib]
|
20
|
+
|
21
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
22
|
+
f.match(%r{^(test|spec|features)/})
|
23
|
+
end
|
24
|
+
|
25
|
+
spec.add_development_dependency 'bundler', '~> 1.17'
|
26
|
+
spec.add_development_dependency 'pry', '~> 0.12'
|
27
|
+
spec.add_development_dependency 'rspec', '~> 3.8'
|
28
|
+
spec.add_development_dependency 'rubocop', '~> 0.60'
|
29
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
#include <stdio.h>
|
2
|
+
#include <ruby.h>
|
3
|
+
|
4
|
+
extern char *serde_rb_rs_<%= serializer[:name] %>(<%= serializer[:joint_fields_c] %>);
|
5
|
+
|
6
|
+
VALUE c_to_json(VALUE _instance, <%= serializer[:fields].map { |f| "VALUE #{f[:name]}" }.join(', ') %>) {
|
7
|
+
<%= serializer[:fields].map { |f| f[:cdecl] }.join("\n") %>
|
8
|
+
return rb_str_new2(serde_rb_rs_<%= serializer[:name] %>(<%= serializer[:fields].map { |f| "c_#{f[:name]}" }.join(', ') %>));
|
9
|
+
}
|
10
|
+
|
11
|
+
void Init_serde_rb(void) {
|
12
|
+
VALUE klass = rb_const_get(rb_cObject, rb_intern("<%= serializer[:class_name] %>"));
|
13
|
+
|
14
|
+
rb_define_method(klass, "internal_to_json", c_to_json, <%= serializer[:fields].length %>);
|
15
|
+
}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
extern crate serde;
|
2
|
+
#[macro_use]
|
3
|
+
extern crate serde_derive;
|
4
|
+
extern crate serde_json;
|
5
|
+
use std::os::raw::c_char;
|
6
|
+
use std::ffi::CStr;
|
7
|
+
|
8
|
+
mod <%= serializer[:name] %>;
|
9
|
+
|
10
|
+
#[no_mangle]
|
11
|
+
pub extern "C" fn serde_rb_rs_<%= serializer[:name] %> (<%= serializer[:joint_fields_rctype] %>) -> *const u8 {
|
12
|
+
let name = unsafe {
|
13
|
+
CStr::from_ptr(name).to_string_lossy().into_owned()
|
14
|
+
};
|
15
|
+
let instance = <%= serializer[:name] %>::Struct {
|
16
|
+
<% serializer[:fields].each do |field| %>
|
17
|
+
<%= field[:name] %>,
|
18
|
+
<% end %>
|
19
|
+
};
|
20
|
+
serde_json::to_string(&instance).unwrap().as_ptr()
|
21
|
+
}
|
metadata
ADDED
@@ -0,0 +1,120 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: serde
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Alexander Komarov
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-11-28 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.17'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.17'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: pry
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.12'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.12'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.8'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.8'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rubocop
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.60'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0.60'
|
69
|
+
description: Fast, compiled serializers for Ruby. Powered by serde.rs.
|
70
|
+
email:
|
71
|
+
- ak@akxcv.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- ".gitignore"
|
77
|
+
- Gemfile
|
78
|
+
- Gemfile.lock
|
79
|
+
- LICENSE
|
80
|
+
- README.md
|
81
|
+
- examples/app/Gemfile
|
82
|
+
- examples/app/Gemfile.lock
|
83
|
+
- examples/app/new.rb
|
84
|
+
- lib/serde.rb
|
85
|
+
- lib/serde/generate.rb
|
86
|
+
- lib/serde/serializer_generator.rb
|
87
|
+
- rust/.gitignore
|
88
|
+
- rust/Cargo.lock
|
89
|
+
- rust/Cargo.toml
|
90
|
+
- rust/src/.keep
|
91
|
+
- serde.gemspec
|
92
|
+
- templates/c/serde_rb.c
|
93
|
+
- templates/extension/serde_rb/extconf.rb
|
94
|
+
- templates/rust/lib.rs
|
95
|
+
- templates/rust/mod.rs
|
96
|
+
homepage: https://github.com/akxcv/serde.rb
|
97
|
+
licenses:
|
98
|
+
- MIT
|
99
|
+
metadata: {}
|
100
|
+
post_install_message:
|
101
|
+
rdoc_options: []
|
102
|
+
require_paths:
|
103
|
+
- lib
|
104
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
105
|
+
requirements:
|
106
|
+
- - ">="
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: 2.5.0
|
109
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
110
|
+
requirements:
|
111
|
+
- - ">="
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: '0'
|
114
|
+
requirements: []
|
115
|
+
rubyforge_project:
|
116
|
+
rubygems_version: 2.7.6
|
117
|
+
signing_key:
|
118
|
+
specification_version: 4
|
119
|
+
summary: Fast, compiled serializers for Ruby.
|
120
|
+
test_files: []
|