hruby-0.2.7: Embed Ruby in your Haskell program.

Safe HaskellNone

Foreign.Ruby.Helpers

Synopsis

Documentation

class FromRuby a whereSource

The class of things that can be converted from Ruby values. Note that there are a ton of stuff that are Ruby values, hence the Maybe type, as the instances will probably be incomplete.

Methods

fromRuby :: RValue -> IO (Maybe a)Source

To define more instances, please look at the instances defined in Foreign.Ruby.Helpers.

Instances

FromRuby Double 
FromRuby Int 
FromRuby Integer 
FromRuby ByteString 
FromRuby Text 
FromRuby Value

This is the most complete instance that is provided in this module. Please note that it is far from being sufficient for even basic requirements. For example, the Value type can only encode dictionnaries with keys that can be converted to strings.

FromRuby a => FromRuby [a] 

class ToRuby a whereSource

Whenever you use ToRuby, don't forget to use something like freezeGC or you will get random segfaults.

Methods

toRuby :: a -> IO RValueSource

embedHaskellValue :: a -> IO RValueSource

This transforms any Haskell value into a Ruby big integer encoding the address of the corresponding StablePtr. This is useful when you want to pass such values to a Ruby program that will call Haskell functions.

This is probably a bad idea to do this. The use case is for calling Haskell functions from Ruby, using values generated from the Haskell world. If your main program is in Haskell, you should probably wrap a function partially applied with the value you would want to embed.

freeHaskellValue :: RValue -> IO ()Source

Frees the Haskell value represented by the corresponding RValue. This is probably extremely unsafe to do, and will most certainly lead to exploitable security bug if you use something modified from Ruby land. You should always free the RValue you generated from embedHaskellValue.

extractHaskellValue :: RValue -> IO aSource

This is unsafe as hell, so you'd better be certain this RValue has not been tempered with : GC frozen, bugfree Ruby scripts.

If it has been tempered by an attacker, you are probably looking at a good vector for arbitrary code execution.

safeMethodCallSource

Arguments

:: String

Class name.

-> String

Method name.

-> [RValue]

Arguments. Please note that the maximum number of arguments is 16.

-> IO (Either (String, RValue) RValue)

Returns either an error message / value couple, or the value returned by the function.

Runs a Ruby method, capturing errors.

showErrorStack :: IO StringSource

Gives a (multiline) error friendly string representation of the last error.

setGCSource

Arguments

:: Bool

Set to True to enable GC, and to False to disable it.

-> IO (Either (String, RValue) RValue) 

Sets the current GC operation. Please note that this could be modified from Ruby scripts.

startGC :: IO ()Source

Runs the Ruby garbage collector.

freezeGC :: IO a -> IO aSource

Runs a computation with the Ruby GC disabled. Once the computation is over, GC will be re-enabled and the startGC function run.