File Coverage

blib/lib/FFI/Platypus/Lang/Rust.pm
Criterion Covered Total %
statement 20 20 100.0
branch n/a
condition n/a
subroutine 7 7 100.0
pod 1 1 100.0
total 28 28 100.0


line stmt bran cond sub pod time code
1             package FFI::Platypus::Lang::Rust;
2              
3 2     2   178881 use strict;
  2         6  
  2         66  
4 2     2   10 use warnings;
  2         5  
  2         56  
5 2     2   14 use File::Glob qw( bsd_glob );
  2         3  
  2         200  
6 2     2   935 use File::Which qw( which );
  2         2038  
  2         106  
7 2     2   15 use File::Spec;
  2         3  
  2         48  
8 2     2   1793 use Env qw( @PATH );
  2         5420  
  2         11  
9              
10             our $VERSION = '0.06';
11              
12             =head1 NAME
13              
14             FFI::Platypus::Lang::Rust - Documentation and tools for using Platypus with
15             the Rust programming language
16              
17             =head1 SYNOPSIS
18              
19             Rust:
20              
21             #![crate_type = "dylib"]
22            
23             // compile with: rustc add.rs
24            
25             #[no_mangle]
26             pub extern "C" fn add(a:i32, b:i32) -> i32 {
27             a+b
28             }
29              
30             Perl:
31              
32             use FFI::Platypus;
33             my $ffi = FFI::Platypus->new;
34             $ffi->lang('Rust');
35             $ffi->lib('./libadd.so');
36            
37             $ffi->attach( add => ['i32', 'i32'] => 'i32' );
38            
39             print add(1,2), "\n"; # prints 3
40              
41             =head1 DESCRIPTION
42              
43             This module provides native Rust types for L in order to
44             reduce cognitive load and concentrate on Rust and forget about C types.
45             This document also documents issues and caveats that I have discovered
46             in my attempts to work with Rust and FFI.
47              
48             This module is somewhat experimental. It is also available for adoption
49             for anyone either sufficiently knowledgeable about Rust or eager enough
50             to learn enough about Rust. If you are interested, please send me a
51             pull request or two on the project's GitHub.
52              
53             Note that in addition to using pre-compiled Rust libraries, you can
54             bundle Rust code with your Perl distribution using
55             L.
56              
57             =head1 CAVEATS
58              
59             In doing my testing I have been using the pre-release 1.0.0 Alpha
60             version of Rust. Rust is a very fast moving target! I have rarely
61             found examples on the internet that still work by the time I get around
62             to trying them. Fast times. Hopefully when it becomes stable things
63             will change.
64              
65             =head2 name mangling
66              
67             Rust names are "mangled" to handle features such as modules and the fact
68             that some characters in Rust names are illegal machine code symbol
69             names. For now that means that you have to tell Rust not to mangle the
70             names of functions that you are going to call from Perl. You can
71             accomplish that like this:
72              
73             #[no_mangle]
74             pub extern "C" fn foo() {
75             }
76              
77             You do not need to add this decoration to functions that you do not
78             directly call from Perl. For example:
79              
80             fn bar() {
81             }
82            
83             #[no_mangle]
84             pub extern "C" fn foo() {
85             bar();
86             }
87              
88             =head1 METHODS
89              
90             Generally you will not use this class directly, instead interacting with
91             the L instance. However, the public methods used by
92             Platypus are documented here.
93              
94             =head2 native_type_map
95              
96             my $hashref = FFI::Platypus::Lang::Rust->native_type_map;
97              
98             This returns a hash reference containing the native aliases for the Rust
99             programming languages. That is the keys are native Rust types and the
100             values are libffi native types.
101              
102             =cut
103              
104             sub native_type_map
105             {
106 16     16 1 737260 require FFI::Platypus;
107             {
108             u8 => 'uint8',
109             u16 => 'uint16',
110             u32 => 'uint32',
111             u64 => 'uint64',
112             i8 => 'sint8',
113             i16 => 'sint16',
114             i32 => 'sint32',
115             i64 => 'sint64',
116             binary32 => 'float', # need to check this is right
117             binary64 => 'double', # " " " " " "
118             f32 => 'float',
119             f64 => 'double',
120             usize => FFI::Platypus->type_meta('size_t')->{ffi_type},
121             isize => FFI::Platypus->type_meta('ssize_t')->{ffi_type},
122             },
123 16         6719 }
124              
125             1;
126              
127             =head1 EXAMPLES
128              
129             See the above L or the C directory that came with
130             this distribution.
131              
132             =head1 SUPPORT
133              
134             If something does not work as advertised, or the way that you think it
135             should, or if you have a feature request, please open an issue on this
136             project's GitHub issue tracker:
137              
138             L
139              
140             =head1 CONTRIBUTING
141              
142             If you have implemented a new feature or fixed a bug then you may make a
143             pull reequest on this project's GitHub repository:
144              
145             L
146              
147             Caution: if you do this too frequently I may nominate you as the new
148             maintainer. Extreme caution: if you like that sort of thing.
149              
150             This project's GitHub issue tracker listed above is not Write-Only. If
151             you want to contribute then feel free to browse through the existing
152             issues and see if there is something you feel you might be good at and
153             take a whack at the problem. I frequently open issues myself that I
154             hope will be accomplished by someone in the future but do not have time
155             to immediately implement myself.
156              
157             Another good area to help out in is documentation. I try to make sure
158             that there is good document coverage, that is there should be
159             documentation describing all the public features and warnings about
160             common pitfalls, but an outsider's or alternate view point on such
161             things would be welcome; if you see something confusing or lacks
162             sufficient detail I encourage documentation only pull requests to
163             improve things.
164              
165             =head1 SEE ALSO
166              
167             =over 4
168              
169             =item L
170              
171             The Core Platypus documentation.
172              
173             =item L
174              
175             Bundle Rust code with your FFI / Perl extension.
176              
177             =back
178              
179             =head1 AUTHOR
180              
181             Graham Ollis Eplicease@cpan.orgE
182              
183             =head1 COPYRIGHT AND LICENSE
184              
185             This software is copyright (c) 2015 by Graham Ollis.
186              
187             This is free software; you can redistribute it and/or modify it under
188             the same terms as the Perl 5 programming language system itself.
189              
190             =cut
191