Comments (7)
If you define the nested structs then it works fine:
gem 'dry-types', '~> 0.8.1'
require 'dry/types'
module Types
include Dry::Types.module
module Coercible
# these can be anything I just defined these so I could make your example work
Email = Types::String
Phone = Types::String
end
end
class Preference < Dry::Types::Struct
attribute :food, Types::Array
end
class Profile < Dry::Types::Struct
attribute :email, Types::Coercible::Email # defined somewhere else
attribute :phone, Types::Coercible::Phone # ^^
attribute :preferences, Preference
end
class User < Dry::Types::Struct
attribute :name, Types::Strict::String
attribute :profile, Profile
end
user = User.new(
name: 'Joe',
profile: {
email: '[email protected]',
phone: '1(234)567-8900',
preferences: {
food: ['ice-cream']
}
}
)
user # => #<User name="Joe" profile=#<Profile email="[email protected]" phone="1(234)567-8900" preferences=#<Preference food=["ice-cream"]>>>
Edit: Ah I didn't see your note about explicit definitions
from dry-struct.
I know you mentioned not wanting to explicitly define these structs but what about just defining them within the class along side the attributes as private constants:
gem 'dry-types', '~> 0.8.1'
require 'dry/types'
module Types
include Dry::Types.module
module Coercible
Email = Types::String
Phone = Types::String
end
end
class User < Dry::Types::Struct
class Profile < Dry::Types::Struct
class Preference < Dry::Types::Struct
attribute :food, Types::Array
end
private_constant(:Preference)
attribute :email, Types::Coercible::Email # defined somewhere else
attribute :phone, Types::Coercible::Phone # ^^
attribute :preferences, Preference
end
private_constant(:Profile)
attribute :name, Types::Strict::String
attribute :profile, Profile
end
user = User.new(
name: 'Joe',
profile: {
email: '[email protected]',
phone: '1(234)567-8900',
preferences: {
food: ['ice-cream']
}
}
)
user # => #<User name="Joe" profile=#<User::Profile email="[email protected]" phone="1(234)567-8900" preferences=#<User::Profile::Preference food=["ice-cream"]>>>
then the definitions are local to their usage, they can't be reused, but you also don't have to worry about dry-types dynamically constructing anonymous structs for you
from dry-struct.
@backus Yes, I do it just in a way of your last example. I think it is still a bit overkillish.
I also see the reason we cannot (or should not) implement a "plain" block syntax I gave above. Because the next question I ask myself is... what if I need that nested struct to be optional?
I have no good solution for this, so this is a problem yet, just the proposal for further discussion.
from dry-struct.
I believe this would be extremely useful, I have a response payload from an API that I want to store as a dry-struct and I think that having to create explicit inner classes for every layer of nesting adds too much overhead for me.
from dry-struct.
this is in master, #58
from dry-struct.
Cool thing! Just to clarify, these three things I'm not sure if they're possible yet:
- Having an array whose elements are an anonymous struct (instead of just a single instance of that element)
- Marking the nested struct as optional
- Supplying a default for the nested struct
otherwise, I could create follow-up issues.
from dry-struct.
We'll unlikely go that far atm, there is transform_types
for things like this, you also can build your own DSL on top of dry-struct, it's an easy thing to do.
from dry-struct.
Related Issues (20)
- Does not create an accessor method when method exists into the mother class HOT 5
- Error while using optional on Dry::Struct HOT 4
- Sum operator not working when default values are defined HOT 4
- Document how sum types works with structs HOT 4
- Instance method name attribute not available HOT 1
- Compose transforms HOT 2
- Subclasses don't recognize properly when attribute described as Types::Array.of(Parent)
- Missing attribute and maybe type HOT 4
- Expanding array item type in generated schema HOT 2
- `define_accessors` eval block consumes nonsensical values
- MissingAttributeError when access optional field with hash syntax
- Assigning nil to attribute returns hash if attribute struct has optional attibutes only HOT 3
- Errors in structs nested inside a Types::Hash raise as `#<NoMethodError: undefined method 'message' for #<String` instead of Dry Errors with the actual message HOT 1
- Struct with optional nested struct requires key in nested struct HOT 2
- [Security] Workflow ci.yml is using vulnerable action actions/checkout
- [Security] Workflow ci.yml is using vulnerable action actions/checkout
- Dry::Struct by including module HOT 1
- Release 1.5.0 breaks rails app boot with eager-loading HOT 8
- Nested optional struct does not inherit `transform_keys(&:to_sym)` HOT 3
- `Dry::Types::ConstraintError` not propagated when originating from inside a `Dry::Types::Map`
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from dry-struct.