@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix doap: <http://usefulinc.com/ns/doap#> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix ggen: <http://ggen.dev/ns#> .

# Project Definition
<project:calculator>
    a doap:Project, ggen:RustProject ;
    doap:name "calculator" ;
    doap:description "A simple calculator library demonstrating ggen template generation" ;
    doap:version "0.1.0" ;
    doap:license "MIT" ;
    ggen:edition "2021" ;

    # Authors
    doap:maintainer [
        a foaf:Person ;
        foaf:name "Generated by ggen" ;
        foaf:mbox <mailto:example@ggen.dev>
    ] ;

    # Dependencies
    ggen:dependency [
        ggen:name "serde" ;
        ggen:version "1.0" ;
        ggen:features "derive"
    ] ;

    ggen:dependency [
        ggen:name "thiserror" ;
        ggen:version "1.0" ;
        ggen:optional false
    ] ;

    # Modules
    ggen:module [
        ggen:name "operations" ;
        ggen:description "Basic arithmetic operations" ;
        ggen:functions (
            [ggen:name "add" ; ggen:signature "fn add(a: f64, b: f64) -> f64"]
            [ggen:name "subtract" ; ggen:signature "fn subtract(a: f64, b: f64) -> f64"]
            [ggen:name "multiply" ; ggen:signature "fn multiply(a: f64, b: f64) -> f64"]
            [ggen:name "divide" ; ggen:signature "fn divide(a: f64, b: f64) -> Result<f64, CalcError>"]
        )
    ] ;

    ggen:module [
        ggen:name "error" ;
        ggen:description "Error handling for calculator operations" ;
        ggen:hasError [
            ggen:name "DivideByZero" ;
            ggen:message "Cannot divide by zero"
        ]
    ] .

# Additional metadata
<project:calculator>
    ggen:feature [
        ggen:name "default" ;
        ggen:includes ()
    ] ;

    ggen:testModule [
        ggen:name "tests" ;
        ggen:description "Unit tests for calculator" ;
        ggen:testCase [
            ggen:name "test_add" ;
            ggen:assertion "add(2.0, 3.0) == 5.0"
        ] ;
        ggen:testCase [
            ggen:name "test_divide_by_zero" ;
            ggen:assertion "divide(1.0, 0.0).is_err()"
        ]
    ] .
